1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2018 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 AAPT2_CONVERT_H 18*d57664e9SAndroid Build Coastguard Worker #define AAPT2_CONVERT_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <optional> 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker #include "Command.h" 23*d57664e9SAndroid Build Coastguard Worker #include "LoadedApk.h" 24*d57664e9SAndroid Build Coastguard Worker #include "format/binary/TableFlattener.h" 25*d57664e9SAndroid Build Coastguard Worker #include "format/binary/XmlFlattener.h" 26*d57664e9SAndroid Build Coastguard Worker 27*d57664e9SAndroid Build Coastguard Worker namespace aapt { 28*d57664e9SAndroid Build Coastguard Worker 29*d57664e9SAndroid Build Coastguard Worker class ConvertCommand : public Command { 30*d57664e9SAndroid Build Coastguard Worker public: ConvertCommand()31*d57664e9SAndroid Build Coastguard Worker explicit ConvertCommand() : Command("convert") { 32*d57664e9SAndroid Build Coastguard Worker SetDescription("Converts an apk between binary and proto formats."); 33*d57664e9SAndroid Build Coastguard Worker AddRequiredFlag("-o", "Output path", &output_path_, Command::kPath); 34*d57664e9SAndroid Build Coastguard Worker AddOptionalFlag("--output-format", android::base::StringPrintf("Format of the output. " 35*d57664e9SAndroid Build Coastguard Worker "Accepted values are '%s' and '%s'. When not set, defaults to '%s'.", 36*d57664e9SAndroid Build Coastguard Worker kOutputFormatProto, kOutputFormatBinary, kOutputFormatBinary), &output_format_); 37*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch( 38*d57664e9SAndroid Build Coastguard Worker "--enable-sparse-encoding", 39*d57664e9SAndroid Build Coastguard Worker "Enables encoding sparse entries using a binary search tree.\n" 40*d57664e9SAndroid Build Coastguard Worker "This decreases APK size at the cost of resource retrieval performance.\n" 41*d57664e9SAndroid Build Coastguard Worker "Only applies sparse encoding to Android O+ resources or all resources if minSdk of " 42*d57664e9SAndroid Build Coastguard Worker "the APK is O+", 43*d57664e9SAndroid Build Coastguard Worker &enable_sparse_encoding_); 44*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("--force-sparse-encoding", 45*d57664e9SAndroid Build Coastguard Worker "Enables encoding sparse entries using a binary search tree.\n" 46*d57664e9SAndroid Build Coastguard Worker "This decreases APK size at the cost of resource retrieval performance.\n" 47*d57664e9SAndroid Build Coastguard Worker "Applies sparse encoding to all resources regardless of minSdk.", 48*d57664e9SAndroid Build Coastguard Worker &force_sparse_encoding_); 49*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch( 50*d57664e9SAndroid Build Coastguard Worker "--enable-compact-entries", 51*d57664e9SAndroid Build Coastguard Worker "This decreases APK size by using compact resource entries for simple data types.", 52*d57664e9SAndroid Build Coastguard Worker &enable_compact_entries_); 53*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("--keep-raw-values", 54*d57664e9SAndroid Build Coastguard Worker android::base::StringPrintf("Preserve raw attribute values in xml files when using the" 55*d57664e9SAndroid Build Coastguard Worker " '%s' output format", kOutputFormatBinary), 56*d57664e9SAndroid Build Coastguard Worker &xml_flattener_options_.keep_raw_values); 57*d57664e9SAndroid Build Coastguard Worker AddOptionalFlag("--resources-config-path", 58*d57664e9SAndroid Build Coastguard Worker "Path to the resources.cfg file containing the list of resources and \n" 59*d57664e9SAndroid Build Coastguard Worker "directives to each resource. \n" 60*d57664e9SAndroid Build Coastguard Worker "Format: type/resource_name#[directive][,directive]", 61*d57664e9SAndroid Build Coastguard Worker &resources_config_path_); 62*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch( 63*d57664e9SAndroid Build Coastguard Worker "--collapse-resource-names", 64*d57664e9SAndroid Build Coastguard Worker "Collapses resource names to a single value in the key string pool. Resources can \n" 65*d57664e9SAndroid Build Coastguard Worker "be exempted using the \"no_collapse\" directive in a file specified by " 66*d57664e9SAndroid Build Coastguard Worker "--resources-config-path.", 67*d57664e9SAndroid Build Coastguard Worker &table_flattener_options_.collapse_key_stringpool); 68*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch( 69*d57664e9SAndroid Build Coastguard Worker "--deduplicate-entry-values", 70*d57664e9SAndroid Build Coastguard Worker "Whether to deduplicate pairs of resource entry and value for simple resources.\n" 71*d57664e9SAndroid Build Coastguard Worker "This is recommended to be used together with '--collapse-resource-names' flag or for\n" 72*d57664e9SAndroid Build Coastguard Worker "APKs where resource names are manually collapsed. For such APKs this flag allows to\n" 73*d57664e9SAndroid Build Coastguard Worker "store the same resource value only once in resource table which decreases APK size.\n" 74*d57664e9SAndroid Build Coastguard Worker "Has no effect on APKs where resource names are kept.", 75*d57664e9SAndroid Build Coastguard Worker &table_flattener_options_.deduplicate_entry_values); 76*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("-v", "Enables verbose logging", &verbose_); 77*d57664e9SAndroid Build Coastguard Worker } 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Worker int Action(const std::vector<std::string>& args) override; 80*d57664e9SAndroid Build Coastguard Worker 81*d57664e9SAndroid Build Coastguard Worker private: 82*d57664e9SAndroid Build Coastguard Worker const static char* kOutputFormatProto; 83*d57664e9SAndroid Build Coastguard Worker const static char* kOutputFormatBinary; 84*d57664e9SAndroid Build Coastguard Worker 85*d57664e9SAndroid Build Coastguard Worker TableFlattenerOptions table_flattener_options_; 86*d57664e9SAndroid Build Coastguard Worker XmlFlattenerOptions xml_flattener_options_; 87*d57664e9SAndroid Build Coastguard Worker std::string output_path_; 88*d57664e9SAndroid Build Coastguard Worker std::optional<std::string> output_format_; 89*d57664e9SAndroid Build Coastguard Worker bool verbose_ = false; 90*d57664e9SAndroid Build Coastguard Worker bool enable_sparse_encoding_ = false; 91*d57664e9SAndroid Build Coastguard Worker bool force_sparse_encoding_ = false; 92*d57664e9SAndroid Build Coastguard Worker bool enable_compact_entries_ = false; 93*d57664e9SAndroid Build Coastguard Worker std::optional<std::string> resources_config_path_; 94*d57664e9SAndroid Build Coastguard Worker }; 95*d57664e9SAndroid Build Coastguard Worker 96*d57664e9SAndroid Build Coastguard Worker int Convert(IAaptContext* context, LoadedApk* input, IArchiveWriter* output_writer, 97*d57664e9SAndroid Build Coastguard Worker ApkFormat output_format,TableFlattenerOptions table_flattener_options, 98*d57664e9SAndroid Build Coastguard Worker XmlFlattenerOptions xml_flattener_options); 99*d57664e9SAndroid Build Coastguard Worker 100*d57664e9SAndroid Build Coastguard Worker } // namespace aapt 101*d57664e9SAndroid Build Coastguard Worker 102*d57664e9SAndroid Build Coastguard Worker #endif //AAPT2_CONVERT_H 103