Home | History | Annotate | Download | only in link
      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 
     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