diff options
author | Roshan Pius <rpius@google.com> | 2020-04-25 16:08:55 -0700 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2020-04-28 00:30:04 +0000 |
commit | 29c974a6243787f1485c39991826f97011389c8e (patch) | |
tree | 5ef178c1fd97ac4c8c51558e9866438ea1470139 /tools | |
parent | b9c89bb3fa1d184c0a740f7b80ebdf8356fbdf9b (diff) |
aapt2: Add command to rename overlay "targetPackage" attribute
Bug: 154960712
Test: atest ManifestFixerTest
Change-Id: I556fc11e271337de40c70d4ed56a0381a2f79712
Merged-In: I556fc11e271337de40c70d4ed56a0381a2f79712
Diffstat (limited to 'tools')
-rw-r--r-- | tools/aapt2/cmd/Link.h | 4 | ||||
-rw-r--r-- | tools/aapt2/link/ManifestFixer.cpp | 22 | ||||
-rw-r--r-- | tools/aapt2/link/ManifestFixer.h | 4 | ||||
-rw-r--r-- | tools/aapt2/link/ManifestFixer_test.cpp | 26 |
4 files changed, 55 insertions, 1 deletions
diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h index 7c583858ee1d..be4d474ebdf3 100644 --- a/tools/aapt2/cmd/Link.h +++ b/tools/aapt2/cmd/Link.h @@ -248,6 +248,10 @@ class LinkCommand : public Command { "Changes the name of the target package for instrumentation. Most useful\n" "when used in conjunction with --rename-manifest-package.", &options_.manifest_fixer_options.rename_instrumentation_target_package); + AddOptionalFlag("--rename-overlay-target-package", + "Changes the name of the target package for overlay. Most useful\n" + "when used in conjunction with --rename-manifest-package.", + &options_.manifest_fixer_options.rename_overlay_target_package); AddOptionalFlagList("-0", "File extensions not to compress.", &options_.extensions_to_not_compress); AddOptionalSwitch("--no-compress", "Do not compress any resources.", diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp index 49909f6e2b8e..06303c273261 100644 --- a/tools/aapt2/link/ManifestFixer.cpp +++ b/tools/aapt2/link/ManifestFixer.cpp @@ -236,6 +236,16 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor, } } + if (options_.rename_overlay_target_package) { + if (!util::IsJavaPackageName(options_.rename_overlay_target_package.value())) { + diag->Error(DiagMessage() + << "invalid overlay target package override '" + << options_.rename_overlay_target_package.value() + << "'"); + return false; + } + } + // Common <intent-filter> actions. xml::XmlNodeAction intent_filter_action; intent_filter_action["action"].Action(RequiredNameIsNotEmpty); @@ -337,7 +347,17 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor, manifest_action["instrumentation"]["meta-data"] = meta_data_action; manifest_action["original-package"]; - manifest_action["overlay"]; + manifest_action["overlay"].Action([&](xml::Element* el) -> bool { + if (!options_.rename_overlay_target_package) { + return true; + } + + if (xml::Attribute* attr = + el->FindAttribute(xml::kSchemaAndroid, "targetPackage")) { + attr->value = options_.rename_overlay_target_package.value(); + } + return true; + }); manifest_action["protected-broadcast"]; manifest_action["adopt-permissions"]; manifest_action["uses-permission"]; diff --git a/tools/aapt2/link/ManifestFixer.h b/tools/aapt2/link/ManifestFixer.h index 3ef57d0d0e42..ec4367b450fb 100644 --- a/tools/aapt2/link/ManifestFixer.h +++ b/tools/aapt2/link/ManifestFixer.h @@ -44,6 +44,10 @@ struct ManifestFixerOptions { // <instrumentation>. Maybe<std::string> rename_instrumentation_target_package; + // The Android package to use instead of the one defined in 'android:targetPackage' in + // <overlay>. + Maybe<std::string> rename_overlay_target_package; + // The version name to set if 'android:versionName' is not defined in <manifest> or if // replace_version is set. Maybe<std::string> version_name_default; diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp index 3f1ee36dea4a..3aba4e2ec49f 100644 --- a/tools/aapt2/link/ManifestFixer_test.cpp +++ b/tools/aapt2/link/ManifestFixer_test.cpp @@ -325,6 +325,32 @@ TEST_F(ManifestFixerTest, EXPECT_THAT(attr->value, StrEq("com.android")); } +TEST_F(ManifestFixerTest, + RenameManifestOverlayPackageAndFullyQualifyTarget) { + ManifestFixerOptions options; + options.rename_overlay_target_package = std::string("com.android"); + + std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( + <manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="android"> + <overlay android:targetName="Customization" android:targetPackage="android" /> + </manifest>)EOF", + options); + ASSERT_THAT(doc, NotNull()); + + xml::Element* manifest_el = doc->root.get(); + ASSERT_THAT(manifest_el, NotNull()); + + xml::Element* overlay_el = + manifest_el->FindChild({}, "overlay"); + ASSERT_THAT(overlay_el, NotNull()); + + xml::Attribute* attr = + overlay_el->FindAttribute(xml::kSchemaAndroid, "targetPackage"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("com.android")); +} + TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) { ManifestFixerOptions options; options.version_name_default = std::string("Beta"); |