From ae12ce41199f0d8b9cb468cd0d8e5b22b0da6022 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Sat, 25 Apr 2020 16:08:55 -0700 Subject: [PATCH] aapt2: Add command to rename overlay "targetPackage" attribute Bug: 154960712 Test: atest ManifestFixerTest Change-Id: I556fc11e271337de40c70d4ed56a0381a2f79712 --- tools/aapt2/cmd/Link.h | 4 ++++ tools/aapt2/link/ManifestFixer.cpp | 22 ++++++++++++++++++++- tools/aapt2/link/ManifestFixer.h | 4 ++++ tools/aapt2/link/ManifestFixer_test.cpp | 26 +++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h index e7be43459e167..852b1244cd6e1 100644 --- a/tools/aapt2/cmd/Link.h +++ b/tools/aapt2/cmd/Link.h @@ -263,6 +263,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 suffix 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 bcfce663db009..c813a446b8dbb 100644 --- a/tools/aapt2/link/ManifestFixer.cpp +++ b/tools/aapt2/link/ManifestFixer.cpp @@ -263,6 +263,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 actions. xml::XmlNodeAction intent_filter_action; intent_filter_action["action"].Action(RequiredNameIsNotEmpty); @@ -373,7 +383,17 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor, manifest_action["attribution"]; manifest_action["attribution"]["inherit-from"]; 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 3ef57d0d0e42e..ec4367b450fb3 100644 --- a/tools/aapt2/link/ManifestFixer.h +++ b/tools/aapt2/link/ManifestFixer.h @@ -44,6 +44,10 @@ struct ManifestFixerOptions { // . Maybe rename_instrumentation_target_package; + // The Android package to use instead of the one defined in 'android:targetPackage' in + // . + Maybe rename_overlay_target_package; + // The version name to set if 'android:versionName' is not defined in or if // replace_version is set. Maybe version_name_default; diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp index 3af06f53d4f39..0791805e25060 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 doc = VerifyWithOptions(R"EOF( + + + )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");