aapt2: Add command to rename overlay "targetPackage" attribute

Bug: 154960712
Test: atest ManifestFixerTest
Change-Id: I556fc11e271337de40c70d4ed56a0381a2f79712
This commit is contained in:
Roshan Pius
2020-04-25 16:08:55 -07:00
parent 922e8b7fe6
commit ae12ce4119
4 changed files with 55 additions and 1 deletions

View File

@@ -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.",

View File

@@ -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 <intent-filter> 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"];

View File

@@ -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;

View File

@@ -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");