1 /* 2 * Copyright (C) 2016 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_LOADEDAPK_H 18 #define AAPT_LOADEDAPK_H 19 20 #include "androidfw/StringPiece.h" 21 22 #include "ResourceTable.h" 23 #include "filter/Filter.h" 24 #include "format/Archive.h" 25 #include "format/binary/BinaryResourceParser.h" 26 #include "format/binary/TableFlattener.h" 27 #include "io/ZipArchive.h" 28 #include "xml/XmlDom.h" 29 30 namespace aapt { 31 32 constexpr static const char kApkResourceTablePath[] = "resources.arsc"; 33 constexpr static const char kProtoResourceTablePath[] = "resources.pb"; 34 constexpr static const char kAndroidManifestPath[] = "AndroidManifest.xml"; 35 36 enum ApkFormat { 37 kUnknown, 38 kBinary, 39 kProto, 40 }; 41 42 // Info about an APK loaded in memory. 43 class LoadedApk { 44 public: 45 virtual ~LoadedApk() = default; 46 47 // Loads both binary and proto APKs from disk. 48 static std::unique_ptr<LoadedApk> LoadApkFromPath(android::StringPiece path, 49 android::IDiagnostics* diag); 50 51 // Loads a proto APK from the given file collection. 52 static std::unique_ptr<LoadedApk> LoadProtoApkFromFileCollection( 53 const android::Source& source, std::unique_ptr<io::IFileCollection> collection, 54 android::IDiagnostics* diag); 55 56 // Loads a binary APK from the given file collection. 57 static std::unique_ptr<LoadedApk> LoadBinaryApkFromFileCollection( 58 const android::Source& source, std::unique_ptr<io::IFileCollection> collection, 59 android::IDiagnostics* diag); 60 LoadedApk(const android::Source & source,std::unique_ptr<io::IFileCollection> apk,std::unique_ptr<ResourceTable> table,std::unique_ptr<xml::XmlResource> manifest,const ApkFormat & format)61 LoadedApk(const android::Source& source, std::unique_ptr<io::IFileCollection> apk, 62 std::unique_ptr<ResourceTable> table, std::unique_ptr<xml::XmlResource> manifest, 63 const ApkFormat& format) 64 : source_(source), 65 apk_(std::move(apk)), 66 table_(std::move(table)), 67 manifest_(std::move(manifest)), 68 format_(format) { 69 } 70 GetFileCollection()71 io::IFileCollection* GetFileCollection() { 72 return apk_.get(); 73 } 74 GetApkFormat()75 ApkFormat GetApkFormat() { 76 return format_; 77 } 78 GetResourceTable()79 const ResourceTable* GetResourceTable() const { 80 return table_.get(); 81 } 82 GetResourceTable()83 ResourceTable* GetResourceTable() { 84 return table_.get(); 85 } 86 GetSource()87 const android::Source& GetSource() { 88 return source_; 89 } 90 GetManifest()91 const xml::XmlResource* GetManifest() const { 92 return manifest_.get(); 93 } 94 95 /** 96 * Writes the APK on disk at the given path, while also removing the resource 97 * files that are not referenced in the resource table. 98 */ 99 virtual bool WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options, 100 IArchiveWriter* writer); 101 102 /** 103 * Writes the APK on disk at the given path, while also removing the resource files that are not 104 * referenced in the resource table. The provided filter chain is applied to each entry in the APK 105 * file. 106 * 107 * If the manifest is also provided, it will be written to the new APK file, otherwise the 108 * original manifest will be written. The manifest is only required if the contents of the new APK 109 * have been modified in a way that require the AndroidManifest.xml to also be modified. 110 */ 111 virtual bool WriteToArchive(IAaptContext* context, ResourceTable* split_table, 112 const TableFlattenerOptions& options, FilterChain* filters, 113 IArchiveWriter* writer, xml::XmlResource* manifest = nullptr); 114 115 /** Loads the file as an xml document. */ 116 std::unique_ptr<xml::XmlResource> LoadXml(const std::string& file_path, 117 android::IDiagnostics* diag) const; 118 119 private: 120 DISALLOW_COPY_AND_ASSIGN(LoadedApk); 121 122 android::Source source_; 123 std::unique_ptr<io::IFileCollection> apk_; 124 std::unique_ptr<ResourceTable> table_; 125 std::unique_ptr<xml::XmlResource> manifest_; 126 ApkFormat format_; 127 }; 128 129 } // namespace aapt 130 131 #endif /* AAPT_LOADEDAPK_H */ 132