xref: /aosp_15_r20/frameworks/base/tools/aapt2/cmd/Convert.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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