| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef __APK_BUILDER_H |
| #define __APK_BUILDER_H |
| |
| #include <set> |
| #include <utils/Errors.h> |
| #include <utils/String8.h> |
| #include <utils/StrongPointer.h> |
| #include <utils/Vector.h> |
| |
| #include "ConfigDescription.h" |
| #include "OutputSet.h" |
| #include "ResourceFilter.h" |
| |
| class ApkSplit; |
| class AaptFile; |
| |
| class ApkBuilder : public android::RefBase { |
| public: |
| explicit ApkBuilder(const sp<WeakResourceFilter>& configFilter); |
| |
| /** |
| * Tells the builder to generate a separate APK for resources that |
| * match the configurations specified. Split APKs can not have |
| * overlapping resources. |
| * |
| * NOTE: All splits should be set up before any files are added. |
| */ |
| android::status_t createSplitForConfigs(const std::set<ConfigDescription>& configs); |
| |
| /** |
| * Adds a file to be written to the final APK. It's name must not collide |
| * with that of any files previously added. When a Split APK is being |
| * generated, duplicates can exist as long as they are in different splits |
| * (resources.arsc, AndroidManifest.xml). |
| */ |
| android::status_t addEntry(const String8& path, const android::sp<AaptFile>& file); |
| |
| android::Vector<sp<ApkSplit> >& getSplits() { |
| return mSplits; |
| } |
| |
| android::sp<ApkSplit> getBaseSplit() { |
| return mSplits[0]; |
| } |
| |
| void print() const; |
| |
| private: |
| android::sp<ResourceFilter> mConfigFilter; |
| android::sp<AndResourceFilter> mDefaultFilter; |
| android::Vector<sp<ApkSplit> > mSplits; |
| }; |
| |
| class ApkSplit : public OutputSet { |
| public: |
| android::status_t addEntry(const String8& path, const android::sp<AaptFile>& file); |
| |
| const std::set<OutputEntry>& getEntries() const { |
| return mFiles; |
| } |
| |
| const std::set<ConfigDescription>& getConfigs() const { |
| return mConfigs; |
| } |
| |
| bool matches(const sp<AaptFile>& file) const { |
| return mFilter->match(file->getGroupEntry().toParams()); |
| } |
| |
| sp<ResourceFilter> getResourceFilter() const { |
| return mFilter; |
| } |
| |
| const android::String8& getPrintableName() const { |
| return mName; |
| } |
| |
| const android::String8& getDirectorySafeName() const { |
| return mDirName; |
| } |
| |
| const android::String8& getPackageSafeName() const { |
| return mPackageSafeName; |
| } |
| |
| bool isBase() const { |
| return mIsBase; |
| } |
| |
| void print() const; |
| |
| private: |
| friend class ApkBuilder; |
| |
| ApkSplit(const std::set<ConfigDescription>& configs, const android::sp<ResourceFilter>& filter, bool isBase=false); |
| |
| std::set<ConfigDescription> mConfigs; |
| const sp<ResourceFilter> mFilter; |
| const bool mIsBase; |
| String8 mName; |
| String8 mDirName; |
| String8 mPackageSafeName; |
| std::set<OutputEntry> mFiles; |
| }; |
| |
| #endif // __APK_BUILDER_H |