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