/* * 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