From 704090e02add5dccbad5e5edb1ff3181af073d81 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 31 Jul 2018 14:59:25 -0700 Subject: [PATCH] AAPT2: Version code major flag Adds flag --version-code-major that injects android:versionCodeMajor into the manifest if none is present or when overriding. Bug: 109883459 Test: aapt2_tests Change-Id: I10b27abb8fa8a99a41976c42c4d684b99978b4f9 --- tools/aapt2/cmd/Link.h | 6 +- tools/aapt2/link/ManifestFixer.cpp | 11 ++ tools/aapt2/link/ManifestFixer.h | 4 + tools/aapt2/link/ManifestFixer_test.cpp | 252 +++++++++++++++--------- 4 files changed, 177 insertions(+), 96 deletions(-) diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h index fb8796ff0a5df..e58a93ec416c1 100644 --- a/tools/aapt2/cmd/Link.h +++ b/tools/aapt2/cmd/Link.h @@ -159,8 +159,10 @@ class LinkCommand : public Command { &options_.manifest_fixer_options.target_sdk_version_default); AddOptionalFlag("--version-code", "Version code (integer) to inject into the AndroidManifest.xml if none is\n" - "present.", - &options_.manifest_fixer_options.version_code_default); + "present.", &options_.manifest_fixer_options.version_code_default); + AddOptionalFlag("--version-code-major", + "Version code major (integer) to inject into the AndroidManifest.xml if none is\n" + "present.", &options_.manifest_fixer_options.version_code_major_default); AddOptionalFlag("--version-name", "Version name to inject into the AndroidManifest.xml if none is present.", &options_.manifest_fixer_options.version_name_default); diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp index ee4e702889948..55a32c8b512cd 100644 --- a/tools/aapt2/link/ManifestFixer.cpp +++ b/tools/aapt2/link/ManifestFixer.cpp @@ -282,6 +282,17 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor, } } + if (options_.version_code_major_default) { + if (options_.replace_version) { + el->RemoveAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + } + if (el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor") == nullptr) { + el->attributes.push_back( + xml::Attribute{xml::kSchemaAndroid, "versionCodeMajor", + options_.version_code_major_default.value()}); + } + } + if (el->FindAttribute("", "platformBuildVersionCode") == nullptr) { auto versionCode = el->FindAttribute(xml::kSchemaAndroid, "versionCode"); if (versionCode != nullptr) { diff --git a/tools/aapt2/link/ManifestFixer.h b/tools/aapt2/link/ManifestFixer.h index 98d06fd776d70..3ef57d0d0e42e 100644 --- a/tools/aapt2/link/ManifestFixer.h +++ b/tools/aapt2/link/ManifestFixer.h @@ -52,6 +52,10 @@ struct ManifestFixerOptions { // replace_version is set. Maybe version_code_default; + // The version code to set if 'android:versionCodeMajor' is not defined in or if + // replace_version is set. + Maybe version_code_major_default; + // The version of the framework being compiled against to set for 'android:compileSdkVersion' in // the tag. Maybe compile_sdk_version; diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp index 5bc004d62ff2d..adea6273bc8b6 100644 --- a/tools/aapt2/link/ManifestFixer_test.cpp +++ b/tools/aapt2/link/ManifestFixer_test.cpp @@ -329,6 +329,7 @@ TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) { ManifestFixerOptions options; options.version_name_default = std::string("Beta"); options.version_code_default = std::string("0x10000000"); + options.version_code_major_default = std::string("0x20000000"); std::unique_ptr doc = VerifyWithOptions(R"EOF( FindAttribute(xml::kSchemaAndroid, "versionCode"); ASSERT_THAT(attr, NotNull()); EXPECT_THAT(attr->value, StrEq("0x10000000")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x20000000")); } TEST_F(ManifestFixerTest, DontUseDefaultVersionNameAndCode) { -ManifestFixerOptions options; -options.version_name_default = std::string("Beta"); -options.version_code_default = std::string("0x10000000"); + ManifestFixerOptions options; + options.version_name_default = std::string("Beta"); + options.version_code_default = std::string("0x10000000"); + options.version_code_major_default = std::string("0x20000000"); -std::unique_ptr doc = VerifyWithOptions(R"EOF( - )EOF", - options); -ASSERT_THAT(doc, NotNull()); + 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* manifest_el = doc->root.get(); + ASSERT_THAT(manifest_el, NotNull()); -xml::Attribute* attr = - manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("Alpha")); + xml::Attribute* attr = + manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("Alpha")); -attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("0x20000000")); + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000001")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000002")); } TEST_F(ManifestFixerTest, ReplaceVersionNameAndCode) { -ManifestFixerOptions options; -options.replace_version = true; -options.version_name_default = std::string("Beta"); -options.version_code_default = std::string("0x10000000"); + ManifestFixerOptions options; + options.replace_version = true; + options.version_name_default = std::string("Beta"); + options.version_code_default = std::string("0x10000000"); + options.version_code_major_default = std::string("0x20000000"); -std::unique_ptr doc = VerifyWithOptions(R"EOF( - )EOF", - options); -ASSERT_THAT(doc, NotNull()); + 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* manifest_el = doc->root.get(); + ASSERT_THAT(manifest_el, NotNull()); -xml::Attribute* attr = - manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("Beta")); + xml::Attribute* attr = + manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("Beta")); -attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("0x10000000")); + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x10000000")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x20000000")); } TEST_F(ManifestFixerTest, ReplaceVersionName) { -ManifestFixerOptions options; -options.replace_version = true; -options.version_name_default = std::string("Beta"); + ManifestFixerOptions options; + options.replace_version = true; + options.version_name_default = std::string("Beta"); -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()); + std::unique_ptr doc = VerifyWithOptions(R"EOF( + )EOF", + options); + ASSERT_THAT(doc, NotNull()); -xml::Attribute* attr = - manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("Beta")); + xml::Element* manifest_el = doc->root.get(); + ASSERT_THAT(manifest_el, NotNull()); -attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("0x20000000")); + xml::Attribute* attr = + manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("Beta")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000001")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000002")); } TEST_F(ManifestFixerTest, ReplaceVersionCode) { -ManifestFixerOptions options; -options.replace_version = true; -options.version_code_default = std::string("0x10000000"); + ManifestFixerOptions options; + options.replace_version = true; + options.version_code_default = std::string("0x10000000"); -std::unique_ptr doc = VerifyWithOptions(R"EOF( + 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::Attribute* attr = + manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("Alpha")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x10000000")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000002")); +} + +TEST_F(ManifestFixerTest, ReplaceVersionCodeMajor) { + ManifestFixerOptions options; + options.replace_version = true; + options.version_code_major_default = std::string("0x20000000"); + + std::unique_ptr doc = VerifyWithOptions(R"EOF( )EOF", - options); -ASSERT_THAT(doc, NotNull()); + package="android" + android:versionCode="0x00000001" + android:versionCodeMajor="0x00000002" + android:versionName="Alpha" />)EOF", + options); + ASSERT_THAT(doc, NotNull()); -xml::Element* manifest_el = doc->root.get(); -ASSERT_THAT(manifest_el, NotNull()); + xml::Element* manifest_el = doc->root.get(); + ASSERT_THAT(manifest_el, NotNull()); -xml::Attribute* attr = - manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("Alpha")); + xml::Attribute* attr = + manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("Alpha")); -attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("0x10000000")); + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000001")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x20000000")); } TEST_F(ManifestFixerTest, DontReplaceVersionNameOrCode) { -ManifestFixerOptions options; -options.replace_version = true; + ManifestFixerOptions options; + options.replace_version = true; -std::unique_ptr doc = VerifyWithOptions(R"EOF( -)EOF", - options); -ASSERT_THAT(doc, NotNull()); + 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* manifest_el = doc->root.get(); + ASSERT_THAT(manifest_el, NotNull()); -xml::Attribute* attr = - manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("Alpha")); + xml::Attribute* attr = + manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("Alpha")); -attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); -ASSERT_THAT(attr, NotNull()); -EXPECT_THAT(attr->value, StrEq("0x20000000")); + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000001")); + + attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor"); + ASSERT_THAT(attr, NotNull()); + EXPECT_THAT(attr->value, StrEq("0x00000002")); } TEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {