diff options
-rw-r--r-- | tools/aapt2/link/ManifestFixer.cpp | 17 | ||||
-rw-r--r-- | tools/aapt2/link/ManifestFixer_test.cpp | 52 |
2 files changed, 69 insertions, 0 deletions
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp index 165702ca42cd..bfff1487d4be 100644 --- a/tools/aapt2/link/ManifestFixer.cpp +++ b/tools/aapt2/link/ManifestFixer.cpp @@ -275,6 +275,23 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor, options_.version_code_default.value()}); } } + + if (el->FindAttribute("", "platformBuildVersionCode") == nullptr) { + auto versionCode = el->FindAttribute(xml::kSchemaAndroid, "versionCode"); + if (versionCode != nullptr) { + el->attributes.push_back(xml::Attribute{"", "platformBuildVersionCode", + versionCode->value}); + } + } + + if (el->FindAttribute("", "platformBuildVersionName") == nullptr) { + auto versionName = el->FindAttribute(xml::kSchemaAndroid, "versionName"); + if (versionName != nullptr) { + el->attributes.push_back(xml::Attribute{"", "platformBuildVersionName", + versionName->value}); + } + } + return true; }); diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp index 8db937439c55..5f406e81f65d 100644 --- a/tools/aapt2/link/ManifestFixer_test.cpp +++ b/tools/aapt2/link/ManifestFixer_test.cpp @@ -556,6 +556,58 @@ TEST_F(ManifestFixerTest, UnexpectedElementsInManifest) { ASSERT_THAT(manifest, IsNull()); } +TEST_F(ManifestFixerTest, InsertPlatformBuildVersions) { + // Test for insertion when versionCode and versionName are included in the manifest + { + std::string input = R"( + <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android" + android:versionCode="27" android:versionName="O"/>)"; + std::unique_ptr<xml::XmlResource> manifest = Verify(input); + ASSERT_THAT(manifest, NotNull()); + + xml::Attribute* attr = manifest->root->FindAttribute("", "platformBuildVersionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("27")); + attr = manifest->root->FindAttribute("", "platformBuildVersionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("O")); + } + + // Test for insertion when versionCode and versionName defaults are specified + { + std::string input = R"( + <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android"/>)"; + ManifestFixerOptions options; + options.version_code_default = {"27"}; + options.version_name_default = {"O"}; + std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(input, options); + ASSERT_THAT(manifest, NotNull()); + + xml::Attribute* attr = manifest->root->FindAttribute("", "platformBuildVersionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("27")); + attr = manifest->root->FindAttribute("", "platformBuildVersionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("O")); + } + + // Test that the platform build version attributes are not changed if they are currently present + { + std::string input = R"( + <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android" + android:versionCode="28" android:versionName="P" + platformBuildVersionCode="27" platformBuildVersionName="O"/>)"; + std::unique_ptr<xml::XmlResource> manifest = Verify(input); + ASSERT_THAT(manifest, NotNull()); + + xml::Attribute* attr = manifest->root->FindAttribute("", "platformBuildVersionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("27")); + attr = manifest->root->FindAttribute("", "platformBuildVersionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("O")); + } +} TEST_F(ManifestFixerTest, UsesLibraryMustHaveNonEmptyName) { std::string input = R"( |