xref: /aosp_15_r20/frameworks/base/tools/aapt2/cmd/Link.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_LINK_H
18*d57664e9SAndroid Build Coastguard Worker #define AAPT2_LINK_H
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <optional>
21*d57664e9SAndroid Build Coastguard Worker #include <regex>
22*d57664e9SAndroid Build Coastguard Worker #include <string>
23*d57664e9SAndroid Build Coastguard Worker #include <unordered_map>
24*d57664e9SAndroid Build Coastguard Worker #include <unordered_set>
25*d57664e9SAndroid Build Coastguard Worker #include <vector>
26*d57664e9SAndroid Build Coastguard Worker 
27*d57664e9SAndroid Build Coastguard Worker #include "Command.h"
28*d57664e9SAndroid Build Coastguard Worker #include "Resource.h"
29*d57664e9SAndroid Build Coastguard Worker #include "androidfw/IDiagnostics.h"
30*d57664e9SAndroid Build Coastguard Worker #include "cmd/Util.h"
31*d57664e9SAndroid Build Coastguard Worker #include "format/binary/TableFlattener.h"
32*d57664e9SAndroid Build Coastguard Worker #include "format/proto/ProtoSerialize.h"
33*d57664e9SAndroid Build Coastguard Worker #include "link/ManifestFixer.h"
34*d57664e9SAndroid Build Coastguard Worker #include "split/TableSplitter.h"
35*d57664e9SAndroid Build Coastguard Worker #include "trace/TraceBuffer.h"
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker namespace aapt {
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker enum class OutputFormat {
40*d57664e9SAndroid Build Coastguard Worker   kApk,
41*d57664e9SAndroid Build Coastguard Worker   kProto,
42*d57664e9SAndroid Build Coastguard Worker };
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker struct LinkOptions {
45*d57664e9SAndroid Build Coastguard Worker   std::string output_path;
46*d57664e9SAndroid Build Coastguard Worker   std::string manifest_path;
47*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> include_paths;
48*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> overlay_files;
49*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> assets_dirs;
50*d57664e9SAndroid Build Coastguard Worker   bool output_to_directory = false;
51*d57664e9SAndroid Build Coastguard Worker   bool auto_add_overlay = false;
52*d57664e9SAndroid Build Coastguard Worker   bool override_styles_instead_of_overlaying = false;
53*d57664e9SAndroid Build Coastguard Worker   OutputFormat output_format = OutputFormat::kApk;
54*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> rename_resources_package;
55*d57664e9SAndroid Build Coastguard Worker 
56*d57664e9SAndroid Build Coastguard Worker   // Java/Proguard options.
57*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> generate_java_class_path;
58*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> custom_java_package;
59*d57664e9SAndroid Build Coastguard Worker   std::set<std::string> extra_java_packages;
60*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> generate_text_symbols_path;
61*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> generate_proguard_rules_path;
62*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> generate_main_dex_proguard_rules_path;
63*d57664e9SAndroid Build Coastguard Worker   bool generate_conditional_proguard_rules = false;
64*d57664e9SAndroid Build Coastguard Worker   bool generate_minimal_proguard_rules = false;
65*d57664e9SAndroid Build Coastguard Worker   bool generate_non_final_ids = false;
66*d57664e9SAndroid Build Coastguard Worker   bool no_proguard_location_reference = false;
67*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> javadoc_annotations;
68*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> private_symbols;
69*d57664e9SAndroid Build Coastguard Worker 
70*d57664e9SAndroid Build Coastguard Worker   // Optimizations/features.
71*d57664e9SAndroid Build Coastguard Worker   bool no_auto_version = false;
72*d57664e9SAndroid Build Coastguard Worker   bool no_version_vectors = false;
73*d57664e9SAndroid Build Coastguard Worker   bool no_version_transitions = false;
74*d57664e9SAndroid Build Coastguard Worker   bool no_resource_deduping = false;
75*d57664e9SAndroid Build Coastguard Worker   bool no_resource_removal = false;
76*d57664e9SAndroid Build Coastguard Worker   bool no_xml_namespaces = false;
77*d57664e9SAndroid Build Coastguard Worker   bool do_not_compress_anything = false;
78*d57664e9SAndroid Build Coastguard Worker   bool use_sparse_encoding = false;
79*d57664e9SAndroid Build Coastguard Worker   std::unordered_set<std::string> extensions_to_not_compress;
80*d57664e9SAndroid Build Coastguard Worker   std::optional<std::regex> regex_to_not_compress;
81*d57664e9SAndroid Build Coastguard Worker   FeatureFlagValues feature_flag_values;
82*d57664e9SAndroid Build Coastguard Worker 
83*d57664e9SAndroid Build Coastguard Worker   // Static lib options.
84*d57664e9SAndroid Build Coastguard Worker   bool no_static_lib_packages = false;
85*d57664e9SAndroid Build Coastguard Worker   bool merge_only = false;
86*d57664e9SAndroid Build Coastguard Worker 
87*d57664e9SAndroid Build Coastguard Worker   // AndroidManifest.xml massaging options.
88*d57664e9SAndroid Build Coastguard Worker   ManifestFixerOptions manifest_fixer_options;
89*d57664e9SAndroid Build Coastguard Worker 
90*d57664e9SAndroid Build Coastguard Worker   // Products to use/filter on.
91*d57664e9SAndroid Build Coastguard Worker   std::unordered_set<std::string> products;
92*d57664e9SAndroid Build Coastguard Worker 
93*d57664e9SAndroid Build Coastguard Worker   // Flattening options.
94*d57664e9SAndroid Build Coastguard Worker   TableFlattenerOptions table_flattener_options;
95*d57664e9SAndroid Build Coastguard Worker   SerializeTableOptions proto_table_flattener_options;
96*d57664e9SAndroid Build Coastguard Worker   bool keep_raw_values = false;
97*d57664e9SAndroid Build Coastguard Worker 
98*d57664e9SAndroid Build Coastguard Worker   // Split APK options.
99*d57664e9SAndroid Build Coastguard Worker   TableSplitterOptions table_splitter_options;
100*d57664e9SAndroid Build Coastguard Worker   std::vector<SplitConstraints> split_constraints;
101*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> split_paths;
102*d57664e9SAndroid Build Coastguard Worker 
103*d57664e9SAndroid Build Coastguard Worker   // Configurations to exclude
104*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> exclude_configs_;
105*d57664e9SAndroid Build Coastguard Worker 
106*d57664e9SAndroid Build Coastguard Worker   // Stable ID options.
107*d57664e9SAndroid Build Coastguard Worker   std::unordered_map<ResourceName, ResourceId> stable_id_map;
108*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> resource_id_map_path;
109*d57664e9SAndroid Build Coastguard Worker 
110*d57664e9SAndroid Build Coastguard Worker   // When 'true', allow reserved package IDs to be used for applications. Pre-O, the platform
111*d57664e9SAndroid Build Coastguard Worker   // treats negative resource IDs [those with a package ID of 0x80 or higher] as invalid.
112*d57664e9SAndroid Build Coastguard Worker   // In order to work around this limitation, we allow the use of traditionally reserved
113*d57664e9SAndroid Build Coastguard Worker   // resource IDs [those between 0x02 and 0x7E].
114*d57664e9SAndroid Build Coastguard Worker   bool allow_reserved_package_id = false;
115*d57664e9SAndroid Build Coastguard Worker 
116*d57664e9SAndroid Build Coastguard Worker   // Whether we should fail on definitions of a resource with conflicting visibility.
117*d57664e9SAndroid Build Coastguard Worker   bool strict_visibility = false;
118*d57664e9SAndroid Build Coastguard Worker };
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker class LinkCommand : public Command {
121*d57664e9SAndroid Build Coastguard Worker  public:
LinkCommand(android::IDiagnostics * diag)122*d57664e9SAndroid Build Coastguard Worker   explicit LinkCommand(android::IDiagnostics* diag) : Command("link", "l"), diag_(diag) {
123*d57664e9SAndroid Build Coastguard Worker     SetDescription("Links resources into an apk.");
124*d57664e9SAndroid Build Coastguard Worker     AddRequiredFlag("-o", "Output path.", &options_.output_path, Command::kPath);
125*d57664e9SAndroid Build Coastguard Worker     AddRequiredFlag("--manifest", "Path to the Android manifest to build.",
126*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_path, Command::kPath);
127*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("-I", "Adds an Android APK to link against.", &options_.include_paths,
128*d57664e9SAndroid Build Coastguard Worker          Command::kPath);
129*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("-A", "An assets directory to include in the APK. These are unprocessed.",
130*d57664e9SAndroid Build Coastguard Worker         &options_.assets_dirs, Command::kPath);
131*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("-R", "Compilation unit to link, using `overlay` semantics.\n"
132*d57664e9SAndroid Build Coastguard Worker         "The last conflicting resource given takes precedence.", &overlay_arg_list_,
133*d57664e9SAndroid Build Coastguard Worker         Command::kPath);
134*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--package-id",
135*d57664e9SAndroid Build Coastguard Worker         "Specify the package ID to use for this app. Must be greater or equal to\n"
136*d57664e9SAndroid Build Coastguard Worker             "0x7f and can't be used with --static-lib or --shared-lib.", &package_id_);
137*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--java", "Directory in which to generate R.java.",
138*d57664e9SAndroid Build Coastguard Worker         &options_.generate_java_class_path, Command::kPath);
139*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--proguard", "Output file for generated Proguard rules.",
140*d57664e9SAndroid Build Coastguard Worker         &options_.generate_proguard_rules_path, Command::kPath);
141*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--proguard-main-dex",
142*d57664e9SAndroid Build Coastguard Worker         "Output file for generated Proguard rules for the main dex.",
143*d57664e9SAndroid Build Coastguard Worker         &options_.generate_main_dex_proguard_rules_path, Command::kPath);
144*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--proguard-conditional-keep-rules",
145*d57664e9SAndroid Build Coastguard Worker         "Generate conditional Proguard keep rules.",
146*d57664e9SAndroid Build Coastguard Worker         &options_.generate_conditional_proguard_rules);
147*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--proguard-minimal-keep-rules",
148*d57664e9SAndroid Build Coastguard Worker         "Generate a minimal set of Proguard keep rules.",
149*d57664e9SAndroid Build Coastguard Worker         &options_.generate_minimal_proguard_rules);
150*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-auto-version", "Disables automatic style and layout SDK versioning.",
151*d57664e9SAndroid Build Coastguard Worker         &options_.no_auto_version);
152*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-version-vectors",
153*d57664e9SAndroid Build Coastguard Worker         "Disables automatic versioning of vector drawables. Use this only\n"
154*d57664e9SAndroid Build Coastguard Worker             "when building with vector drawable support library.",
155*d57664e9SAndroid Build Coastguard Worker         &options_.no_version_vectors);
156*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-version-transitions",
157*d57664e9SAndroid Build Coastguard Worker         "Disables automatic versioning of transition resources. Use this only\n"
158*d57664e9SAndroid Build Coastguard Worker             "when building with transition support library.",
159*d57664e9SAndroid Build Coastguard Worker         &options_.no_version_transitions);
160*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-resource-deduping", "Disables automatic deduping of resources with\n"
161*d57664e9SAndroid Build Coastguard Worker             "identical values across compatible configurations.",
162*d57664e9SAndroid Build Coastguard Worker         &options_.no_resource_deduping);
163*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-resource-removal", "Disables automatic removal of resources without\n"
164*d57664e9SAndroid Build Coastguard Worker             "defaults. Use this only when building runtime resource overlay packages.",
165*d57664e9SAndroid Build Coastguard Worker         &options_.no_resource_removal);
166*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--enable-sparse-encoding",
167*d57664e9SAndroid Build Coastguard Worker                       "This decreases APK size at the cost of resource retrieval performance.",
168*d57664e9SAndroid Build Coastguard Worker                       &options_.use_sparse_encoding);
169*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--enable-compact-entries",
170*d57664e9SAndroid Build Coastguard Worker         "This decreases APK size by using compact resource entries for simple data types.",
171*d57664e9SAndroid Build Coastguard Worker         &options_.table_flattener_options.use_compact_entries);
172*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("-x", "Legacy flag that specifies to use the package identifier 0x01.",
173*d57664e9SAndroid Build Coastguard Worker         &legacy_x_flag_);
174*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("-z", "Require localization of strings marked 'suggested'.",
175*d57664e9SAndroid Build Coastguard Worker         &require_localization_);
176*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("-c",
177*d57664e9SAndroid Build Coastguard Worker         "Comma separated list of configurations to include. The default\n"
178*d57664e9SAndroid Build Coastguard Worker             "is all configurations.", &configs_);
179*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--preferred-density",
180*d57664e9SAndroid Build Coastguard Worker         "Selects the closest matching density and strips out all others.",
181*d57664e9SAndroid Build Coastguard Worker         &preferred_density_);
182*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--product", "Comma separated list of product names to keep", &product_list_);
183*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--output-to-dir", "Outputs the APK contents to a directory specified by -o.",
184*d57664e9SAndroid Build Coastguard Worker         &options_.output_to_directory);
185*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-xml-namespaces", "Removes XML namespace prefix and URI information\n"
186*d57664e9SAndroid Build Coastguard Worker             "from AndroidManifest.xml and XML binaries in res/*.",
187*d57664e9SAndroid Build Coastguard Worker         &options_.no_xml_namespaces);
188*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--min-sdk-version",
189*d57664e9SAndroid Build Coastguard Worker         "Default minimum SDK version to use for AndroidManifest.xml.",
190*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.min_sdk_version_default);
191*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--target-sdk-version",
192*d57664e9SAndroid Build Coastguard Worker         "Default target SDK version to use for AndroidManifest.xml.",
193*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.target_sdk_version_default);
194*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--version-code",
195*d57664e9SAndroid Build Coastguard Worker         "Version code (integer) to inject into the AndroidManifest.xml if none is\n"
196*d57664e9SAndroid Build Coastguard Worker             "present.", &options_.manifest_fixer_options.version_code_default);
197*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--version-code-major",
198*d57664e9SAndroid Build Coastguard Worker         "Version code major (integer) to inject into the AndroidManifest.xml if none is\n"
199*d57664e9SAndroid Build Coastguard Worker             "present.", &options_.manifest_fixer_options.version_code_major_default);
200*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--version-name",
201*d57664e9SAndroid Build Coastguard Worker         "Version name to inject into the AndroidManifest.xml if none is present.",
202*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.version_name_default);
203*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--revision-code",
204*d57664e9SAndroid Build Coastguard Worker         "Revision code (integer) to inject into the AndroidManifest.xml if none is\n"
205*d57664e9SAndroid Build Coastguard Worker             "present.", &options_.manifest_fixer_options.revision_code_default);
206*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--replace-version",
207*d57664e9SAndroid Build Coastguard Worker         "If --version-code, --version-name, and/or --revision-code are specified, these\n"
208*d57664e9SAndroid Build Coastguard Worker             "values will replace any value already in the manifest. By\n"
209*d57664e9SAndroid Build Coastguard Worker             "default, nothing is changed if the manifest already defines\n"
210*d57664e9SAndroid Build Coastguard Worker             "these attributes.",
211*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.replace_version);
212*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--compile-sdk-version-code",
213*d57664e9SAndroid Build Coastguard Worker         "Version code (integer) to inject into the AndroidManifest.xml if none is\n"
214*d57664e9SAndroid Build Coastguard Worker             "present.",
215*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.compile_sdk_version);
216*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--compile-sdk-version-name",
217*d57664e9SAndroid Build Coastguard Worker         "Version name to inject into the AndroidManifest.xml if none is present.",
218*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.compile_sdk_version_codename);
219*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch(
220*d57664e9SAndroid Build Coastguard Worker         "--no-compile-sdk-metadata",
221*d57664e9SAndroid Build Coastguard Worker         "Suppresses output of compile SDK-related attributes in AndroidManifest.xml,\n"
222*d57664e9SAndroid Build Coastguard Worker         "including android:compileSdkVersion and platformBuildVersion.",
223*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.no_compile_sdk_metadata);
224*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("--fingerprint-prefix", "Fingerprint prefix to add to install constraints.",
225*d57664e9SAndroid Build Coastguard Worker                         &options_.manifest_fixer_options.fingerprint_prefixes);
226*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--shared-lib", "Generates a shared Android runtime library.",
227*d57664e9SAndroid Build Coastguard Worker         &shared_lib_);
228*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--static-lib", "Generate a static Android library.", &static_lib_);
229*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--proto-format",
230*d57664e9SAndroid Build Coastguard Worker         "Generates compiled resources in Protobuf format.\n"
231*d57664e9SAndroid Build Coastguard Worker             "Suitable as input to the bundle tool for generating an App Bundle.",
232*d57664e9SAndroid Build Coastguard Worker         &proto_format_);
233*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-static-lib-packages",
234*d57664e9SAndroid Build Coastguard Worker         "Merge all library resources under the app's package.",
235*d57664e9SAndroid Build Coastguard Worker         &options_.no_static_lib_packages);
236*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--non-final-ids",
237*d57664e9SAndroid Build Coastguard Worker         "Generates R.java without the final modifier. This is implied when\n"
238*d57664e9SAndroid Build Coastguard Worker             "--static-lib is specified.",
239*d57664e9SAndroid Build Coastguard Worker         &options_.generate_non_final_ids);
240*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-proguard-location-reference",
241*d57664e9SAndroid Build Coastguard Worker         "Keep proguard rules files from having a reference to the source file",
242*d57664e9SAndroid Build Coastguard Worker         &options_.no_proguard_location_reference);
243*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--stable-ids", "File containing a list of name to ID mapping.",
244*d57664e9SAndroid Build Coastguard Worker         &stable_id_file_path_);
245*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--emit-ids",
246*d57664e9SAndroid Build Coastguard Worker         "Emit a file at the given path with a list of name to ID mappings,\n"
247*d57664e9SAndroid Build Coastguard Worker             "suitable for use with --stable-ids.",
248*d57664e9SAndroid Build Coastguard Worker         &options_.resource_id_map_path);
249*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--private-symbols",
250*d57664e9SAndroid Build Coastguard Worker         "Package name to use when generating R.java for private symbols.\n"
251*d57664e9SAndroid Build Coastguard Worker             "If not specified, public and private symbols will use the application's\n"
252*d57664e9SAndroid Build Coastguard Worker             "package name.",
253*d57664e9SAndroid Build Coastguard Worker         &options_.private_symbols);
254*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--custom-package", "Custom Java package under which to generate R.java.",
255*d57664e9SAndroid Build Coastguard Worker         &options_.custom_java_package);
256*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("--extra-packages",
257*d57664e9SAndroid Build Coastguard Worker         "Generate the same R.java but with different package names.",
258*d57664e9SAndroid Build Coastguard Worker         &extra_java_packages_);
259*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("--add-javadoc-annotation",
260*d57664e9SAndroid Build Coastguard Worker         "Adds a JavaDoc annotation to all generated Java classes.",
261*d57664e9SAndroid Build Coastguard Worker         &options_.javadoc_annotations);
262*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--output-text-symbols",
263*d57664e9SAndroid Build Coastguard Worker         "Generates a text file containing the resource symbols of the R class in\n"
264*d57664e9SAndroid Build Coastguard Worker             "the specified folder.",
265*d57664e9SAndroid Build Coastguard Worker         &options_.generate_text_symbols_path);
266*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--allow-reserved-package-id",
267*d57664e9SAndroid Build Coastguard Worker         "Allows the use of a reserved package ID. This should on be used for\n"
268*d57664e9SAndroid Build Coastguard Worker             "packages with a pre-O min-sdk\n",
269*d57664e9SAndroid Build Coastguard Worker         &options_.allow_reserved_package_id);
270*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--auto-add-overlay",
271*d57664e9SAndroid Build Coastguard Worker         "Allows the addition of new resources in overlays without\n"
272*d57664e9SAndroid Build Coastguard Worker             "<add-resource> tags.",
273*d57664e9SAndroid Build Coastguard Worker         &options_.auto_add_overlay);
274*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--override-styles-instead-of-overlaying",
275*d57664e9SAndroid Build Coastguard Worker         "Causes styles defined in -R resources to replace previous definitions\n"
276*d57664e9SAndroid Build Coastguard Worker             "instead of merging into them\n",
277*d57664e9SAndroid Build Coastguard Worker         &options_.override_styles_instead_of_overlaying);
278*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--rename-manifest-package", "Renames the package in AndroidManifest.xml.",
279*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.rename_manifest_package);
280*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--rename-resources-package", "Renames the package in resources table",
281*d57664e9SAndroid Build Coastguard Worker         &options_.rename_resources_package);
282*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--rename-instrumentation-target-package",
283*d57664e9SAndroid Build Coastguard Worker         "Changes the name of the target package for instrumentation. Most useful\n"
284*d57664e9SAndroid Build Coastguard Worker             "when used in conjunction with --rename-manifest-package.",
285*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.rename_instrumentation_target_package);
286*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--rename-overlay-target-package",
287*d57664e9SAndroid Build Coastguard Worker         "Changes the name of the target package for overlay. Most useful\n"
288*d57664e9SAndroid Build Coastguard Worker             "when used in conjunction with --rename-manifest-package.",
289*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.rename_overlay_target_package);
290*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--rename-overlay-category", "Changes the category for the overlay.",
291*d57664e9SAndroid Build Coastguard Worker                     &options_.manifest_fixer_options.rename_overlay_category);
292*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("-0", "File suffix not to compress.",
293*d57664e9SAndroid Build Coastguard Worker         &options_.extensions_to_not_compress);
294*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--no-compress", "Do not compress any resources.",
295*d57664e9SAndroid Build Coastguard Worker         &options_.do_not_compress_anything);
296*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--keep-raw-values", "Preserve raw attribute values in xml files.",
297*d57664e9SAndroid Build Coastguard Worker         &options_.keep_raw_values);
298*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--no-compress-regex",
299*d57664e9SAndroid Build Coastguard Worker         "Do not compress extensions matching the regular expression. Remember to\n"
300*d57664e9SAndroid Build Coastguard Worker             "use the '$' symbol for end of line. Uses a case-sensitive ECMAScript"
301*d57664e9SAndroid Build Coastguard Worker             "regular expression grammar.",
302*d57664e9SAndroid Build Coastguard Worker         &no_compress_regex);
303*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--warn-manifest-validation",
304*d57664e9SAndroid Build Coastguard Worker         "Treat manifest validation errors as warnings.",
305*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.warn_validation);
306*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("--split",
307*d57664e9SAndroid Build Coastguard Worker         "Split resources matching a set of configs out to a Split APK.\n"
308*d57664e9SAndroid Build Coastguard Worker             "Syntax: path/to/output.apk:<config>[,<config>[...]].\n"
309*d57664e9SAndroid Build Coastguard Worker             "On Windows, use a semicolon ';' separator instead.",
310*d57664e9SAndroid Build Coastguard Worker         &split_args_);
311*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("--exclude-configs",
312*d57664e9SAndroid Build Coastguard Worker         "Excludes values of resources whose configs contain the specified qualifiers.",
313*d57664e9SAndroid Build Coastguard Worker         &options_.exclude_configs_);
314*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--debug-mode",
315*d57664e9SAndroid Build Coastguard Worker         "Inserts android:debuggable=\"true\" in to the application node of the\n"
316*d57664e9SAndroid Build Coastguard Worker             "manifest, making the application debuggable even on production devices.",
317*d57664e9SAndroid Build Coastguard Worker         &options_.manifest_fixer_options.debug_mode);
318*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--strict-visibility",
319*d57664e9SAndroid Build Coastguard Worker         "Do not allow overlays with different visibility levels.",
320*d57664e9SAndroid Build Coastguard Worker         &options_.strict_visibility);
321*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--exclude-sources",
322*d57664e9SAndroid Build Coastguard Worker         "Do not serialize source file information when generating resources in\n"
323*d57664e9SAndroid Build Coastguard Worker             "Protobuf format.",
324*d57664e9SAndroid Build Coastguard Worker         &options_.proto_table_flattener_options.exclude_sources);
325*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlag("--trace-folder",
326*d57664e9SAndroid Build Coastguard Worker         "Generate systrace json trace fragment to specified folder.",
327*d57664e9SAndroid Build Coastguard Worker         &trace_folder_);
328*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--merge-only",
329*d57664e9SAndroid Build Coastguard Worker         "Only merge the resources, without verifying resource references. This flag\n"
330*d57664e9SAndroid Build Coastguard Worker             "should only be used together with the --static-lib flag.",
331*d57664e9SAndroid Build Coastguard Worker         &options_.merge_only);
332*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_);
333*d57664e9SAndroid Build Coastguard Worker     AddOptionalFlagList("--feature-flags",
334*d57664e9SAndroid Build Coastguard Worker                         "Specify the values of feature flags. The pairs in the argument\n"
335*d57664e9SAndroid Build Coastguard Worker                         "are separated by ',' the name is separated from the value by '='.\n"
336*d57664e9SAndroid Build Coastguard Worker                         "The name can have a suffix of ':ro' to indicate it is read only."
337*d57664e9SAndroid Build Coastguard Worker                         "Example: \"flag1=true,flag2:ro=false,flag3=\" (flag3 has no given value).",
338*d57664e9SAndroid Build Coastguard Worker                         &feature_flags_args_);
339*d57664e9SAndroid Build Coastguard Worker     AddOptionalSwitch("--non-updatable-system",
340*d57664e9SAndroid Build Coastguard Worker                       "Mark the app as a non-updatable system app. This inserts\n"
341*d57664e9SAndroid Build Coastguard Worker                       "updatableSystem=\"false\" to the root manifest node, overwriting any\n"
342*d57664e9SAndroid Build Coastguard Worker                       "existing attribute. This is ignored if the manifest has a versionCode.",
343*d57664e9SAndroid Build Coastguard Worker                       &options_.manifest_fixer_options.non_updatable_system);
344*d57664e9SAndroid Build Coastguard Worker   }
345*d57664e9SAndroid Build Coastguard Worker 
346*d57664e9SAndroid Build Coastguard Worker   int Action(const std::vector<std::string>& args) override;
347*d57664e9SAndroid Build Coastguard Worker 
348*d57664e9SAndroid Build Coastguard Worker  private:
349*d57664e9SAndroid Build Coastguard Worker   android::IDiagnostics* diag_;
350*d57664e9SAndroid Build Coastguard Worker   LinkOptions options_;
351*d57664e9SAndroid Build Coastguard Worker 
352*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> overlay_arg_list_;
353*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> extra_java_packages_;
354*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> package_id_;
355*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> configs_;
356*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> preferred_density_;
357*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> product_list_;
358*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> no_compress_regex;
359*d57664e9SAndroid Build Coastguard Worker   bool legacy_x_flag_ = false;
360*d57664e9SAndroid Build Coastguard Worker   bool require_localization_ = false;
361*d57664e9SAndroid Build Coastguard Worker   bool verbose_ = false;
362*d57664e9SAndroid Build Coastguard Worker   bool shared_lib_ = false;
363*d57664e9SAndroid Build Coastguard Worker   bool static_lib_ = false;
364*d57664e9SAndroid Build Coastguard Worker   bool proto_format_ = false;
365*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> stable_id_file_path_;
366*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> split_args_;
367*d57664e9SAndroid Build Coastguard Worker   std::optional<std::string> trace_folder_;
368*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> feature_flags_args_;
369*d57664e9SAndroid Build Coastguard Worker };
370*d57664e9SAndroid Build Coastguard Worker 
371*d57664e9SAndroid Build Coastguard Worker }// namespace aapt
372*d57664e9SAndroid Build Coastguard Worker 
373*d57664e9SAndroid Build Coastguard Worker #endif //AAPT2_LINK_H
374