xref: /aosp_15_r20/frameworks/base/tools/aapt/ApkBuilder.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #ifndef __APK_BUILDER_H
18*d57664e9SAndroid Build Coastguard Worker #define __APK_BUILDER_H
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <set>
21*d57664e9SAndroid Build Coastguard Worker #include <utils/Errors.h>
22*d57664e9SAndroid Build Coastguard Worker #include <utils/String8.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/StrongPointer.h>
24*d57664e9SAndroid Build Coastguard Worker #include <utils/Vector.h>
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker #include "ConfigDescription.h"
27*d57664e9SAndroid Build Coastguard Worker #include "OutputSet.h"
28*d57664e9SAndroid Build Coastguard Worker #include "ResourceFilter.h"
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker class ApkSplit;
31*d57664e9SAndroid Build Coastguard Worker class AaptFile;
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker class ApkBuilder : public android::RefBase {
34*d57664e9SAndroid Build Coastguard Worker public:
35*d57664e9SAndroid Build Coastguard Worker     explicit ApkBuilder(const sp<WeakResourceFilter>& configFilter);
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker     /**
38*d57664e9SAndroid Build Coastguard Worker      * Tells the builder to generate a separate APK for resources that
39*d57664e9SAndroid Build Coastguard Worker      * match the configurations specified. Split APKs can not have
40*d57664e9SAndroid Build Coastguard Worker      * overlapping resources.
41*d57664e9SAndroid Build Coastguard Worker      *
42*d57664e9SAndroid Build Coastguard Worker      * NOTE: All splits should be set up before any files are added.
43*d57664e9SAndroid Build Coastguard Worker      */
44*d57664e9SAndroid Build Coastguard Worker     android::status_t createSplitForConfigs(const std::set<ConfigDescription>& configs);
45*d57664e9SAndroid Build Coastguard Worker 
46*d57664e9SAndroid Build Coastguard Worker     /**
47*d57664e9SAndroid Build Coastguard Worker      * Adds a file to be written to the final APK. Its name must not collide
48*d57664e9SAndroid Build Coastguard Worker      * with that of any files previously added. When a Split APK is being
49*d57664e9SAndroid Build Coastguard Worker      * generated, duplicates can exist as long as they are in different splits
50*d57664e9SAndroid Build Coastguard Worker      * (resources.arsc, AndroidManifest.xml).
51*d57664e9SAndroid Build Coastguard Worker      */
52*d57664e9SAndroid Build Coastguard Worker     android::status_t addEntry(const String8& path, const android::sp<AaptFile>& file);
53*d57664e9SAndroid Build Coastguard Worker 
getSplits()54*d57664e9SAndroid Build Coastguard Worker     android::Vector<sp<ApkSplit> >& getSplits() {
55*d57664e9SAndroid Build Coastguard Worker         return mSplits;
56*d57664e9SAndroid Build Coastguard Worker     }
57*d57664e9SAndroid Build Coastguard Worker 
getBaseSplit()58*d57664e9SAndroid Build Coastguard Worker     android::sp<ApkSplit> getBaseSplit() {
59*d57664e9SAndroid Build Coastguard Worker         return mSplits[0];
60*d57664e9SAndroid Build Coastguard Worker     }
61*d57664e9SAndroid Build Coastguard Worker 
62*d57664e9SAndroid Build Coastguard Worker     void print() const;
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker private:
65*d57664e9SAndroid Build Coastguard Worker     android::sp<ResourceFilter> mConfigFilter;
66*d57664e9SAndroid Build Coastguard Worker     android::sp<AndResourceFilter> mDefaultFilter;
67*d57664e9SAndroid Build Coastguard Worker     android::Vector<sp<ApkSplit> > mSplits;
68*d57664e9SAndroid Build Coastguard Worker };
69*d57664e9SAndroid Build Coastguard Worker 
70*d57664e9SAndroid Build Coastguard Worker class ApkSplit : public OutputSet {
71*d57664e9SAndroid Build Coastguard Worker public:
72*d57664e9SAndroid Build Coastguard Worker     android::status_t addEntry(const String8& path, const android::sp<AaptFile>& file);
73*d57664e9SAndroid Build Coastguard Worker 
getEntries()74*d57664e9SAndroid Build Coastguard Worker     const std::set<OutputEntry>& getEntries() const {
75*d57664e9SAndroid Build Coastguard Worker         return mFiles;
76*d57664e9SAndroid Build Coastguard Worker     }
77*d57664e9SAndroid Build Coastguard Worker 
getConfigs()78*d57664e9SAndroid Build Coastguard Worker     const std::set<ConfigDescription>& getConfigs() const {
79*d57664e9SAndroid Build Coastguard Worker         return mConfigs;
80*d57664e9SAndroid Build Coastguard Worker     }
81*d57664e9SAndroid Build Coastguard Worker 
matches(const sp<AaptFile> & file)82*d57664e9SAndroid Build Coastguard Worker     bool matches(const sp<AaptFile>& file) const {
83*d57664e9SAndroid Build Coastguard Worker         return mFilter->match(file->getGroupEntry().toParams());
84*d57664e9SAndroid Build Coastguard Worker     }
85*d57664e9SAndroid Build Coastguard Worker 
getResourceFilter()86*d57664e9SAndroid Build Coastguard Worker     sp<ResourceFilter> getResourceFilter() const {
87*d57664e9SAndroid Build Coastguard Worker         return mFilter;
88*d57664e9SAndroid Build Coastguard Worker     }
89*d57664e9SAndroid Build Coastguard Worker 
getPrintableName()90*d57664e9SAndroid Build Coastguard Worker     const android::String8& getPrintableName() const {
91*d57664e9SAndroid Build Coastguard Worker         return mName;
92*d57664e9SAndroid Build Coastguard Worker     }
93*d57664e9SAndroid Build Coastguard Worker 
getDirectorySafeName()94*d57664e9SAndroid Build Coastguard Worker     const android::String8& getDirectorySafeName() const {
95*d57664e9SAndroid Build Coastguard Worker         return mDirName;
96*d57664e9SAndroid Build Coastguard Worker     }
97*d57664e9SAndroid Build Coastguard Worker 
getPackageSafeName()98*d57664e9SAndroid Build Coastguard Worker     const android::String8& getPackageSafeName() const {
99*d57664e9SAndroid Build Coastguard Worker         return mPackageSafeName;
100*d57664e9SAndroid Build Coastguard Worker     }
101*d57664e9SAndroid Build Coastguard Worker 
isBase()102*d57664e9SAndroid Build Coastguard Worker     bool isBase() const {
103*d57664e9SAndroid Build Coastguard Worker         return mIsBase;
104*d57664e9SAndroid Build Coastguard Worker     }
105*d57664e9SAndroid Build Coastguard Worker 
106*d57664e9SAndroid Build Coastguard Worker     void print() const;
107*d57664e9SAndroid Build Coastguard Worker 
108*d57664e9SAndroid Build Coastguard Worker private:
109*d57664e9SAndroid Build Coastguard Worker     friend class ApkBuilder;
110*d57664e9SAndroid Build Coastguard Worker 
111*d57664e9SAndroid Build Coastguard Worker     ApkSplit(const std::set<ConfigDescription>& configs, const android::sp<ResourceFilter>& filter, bool isBase=false);
112*d57664e9SAndroid Build Coastguard Worker 
113*d57664e9SAndroid Build Coastguard Worker     std::set<ConfigDescription> mConfigs;
114*d57664e9SAndroid Build Coastguard Worker     const sp<ResourceFilter> mFilter;
115*d57664e9SAndroid Build Coastguard Worker     const bool mIsBase;
116*d57664e9SAndroid Build Coastguard Worker     String8 mName;
117*d57664e9SAndroid Build Coastguard Worker     String8 mDirName;
118*d57664e9SAndroid Build Coastguard Worker     String8 mPackageSafeName;
119*d57664e9SAndroid Build Coastguard Worker     std::set<OutputEntry> mFiles;
120*d57664e9SAndroid Build Coastguard Worker };
121*d57664e9SAndroid Build Coastguard Worker 
122*d57664e9SAndroid Build Coastguard Worker #endif // __APK_BUILDER_H
123