• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef AAPT_TABLEMERGER_H
18 #define AAPT_TABLEMERGER_H
19 
20 #include <functional>
21 #include <map>
22 
23 #include "android-base/macros.h"
24 
25 #include "Resource.h"
26 #include "ResourceTable.h"
27 #include "ResourceValues.h"
28 #include "filter/ConfigFilter.h"
29 #include "io/File.h"
30 #include "process/IResourceTableConsumer.h"
31 #include "util/Util.h"
32 
33 namespace aapt {
34 
35 struct TableMergerOptions {
36   // If true, resources in overlays can be added without previously having existed.
37   bool auto_add_overlay = false;
38 };
39 
40 // TableMerger takes resource tables and merges all packages within the tables that have the same
41 // package ID.
42 //
43 // It is assumed that any FileReference values have their io::IFile pointer set to point to the
44 // file they represent.
45 //
46 // If a package has a different name, all the entries in that table have their names mangled
47 // to include the package name. This way there are no collisions. In order to do this correctly,
48 // the TableMerger needs to also mangle any FileReference paths. Once these are mangled, the
49 // `IFile` pointer in `FileReference` will point to the original file.
50 //
51 // Once the merging is complete, a separate phase can go collect the files from the various
52 // source APKs and either copy or process their XML and put them in the correct location in the
53 // final APK.
54 class TableMerger {
55  public:
56   // Note: The out_table ResourceTable must live longer than this TableMerger.
57   // References are made to this ResourceTable for efficiency reasons.
58   TableMerger(IAaptContext* context, ResourceTable* out_table, const TableMergerOptions& options);
59 
merged_packages()60   inline const std::set<std::string>& merged_packages() const {
61     return merged_packages_;
62   }
63 
64   // Merges resources from the same or empty package. This is for local sources.
65   // If overlay is true, the resources are treated as overlays.
66   bool Merge(const Source& src, ResourceTable* table, bool overlay);
67 
68   // Merges resources from the given package, mangling the name. This is for static libraries.
69   // All FileReference values must have their io::IFile set.
70   bool MergeAndMangle(const Source& src, const android::StringPiece& package, ResourceTable* table);
71 
72   // Merges a compiled file that belongs to this same or empty package.
73   bool MergeFile(const ResourceFile& fileDesc, bool overlay, io::IFile* file);
74 
75  private:
76   DISALLOW_COPY_AND_ASSIGN(TableMerger);
77 
78   IAaptContext* context_;
79   ResourceTable* master_table_;
80   TableMergerOptions options_;
81   ResourceTablePackage* master_package_;
82   std::set<std::string> merged_packages_;
83 
84   bool MergeImpl(const Source& src, ResourceTable* src_table, bool overlay, bool allow_new);
85 
86   bool DoMerge(const Source& src, ResourceTable* src_table, ResourceTablePackage* src_package,
87                bool mangle_package, bool overlay, bool allow_new_resources);
88 
89   std::unique_ptr<FileReference> CloneAndMangleFile(const std::string& package,
90                                                     const FileReference& value);
91 };
92 
93 }  // namespace aapt
94 
95 #endif /* AAPT_TABLEMERGER_H */
96