diff options
author | Mark Punzalan <markpun@google.com> | 2024-01-24 22:58:41 -0800 |
---|---|---|
committer | Mark Punzalan <markpun@google.com> | 2024-01-24 23:46:07 -0800 |
commit | 12dc2b8a9fff3defe3348d9af16fef2f5fa5d7b9 (patch) | |
tree | 8e25f74a1e1dec602a73b1fbb458adea4db47dc6 /tools | |
parent | 5059e0cc54e2c6f6e3a630893f5554d3bd5ed849 (diff) | |
download | base-12dc2b8a9fff3defe3348d9af16fef2f5fa5d7b9.tar.gz |
[aapt2] Always generate code for permissions
We will generate the String constant in Manifest.java for a permission
or permission group even if it is removed via feature flag. This is so
that code referencing the string will still compile.
Bug: 297373084
Bug: 318014882
Test: atest aapt2_tests
Test: Modified framework-res to build with SDK version 34 and forced
removal of a permission with a disabled feature flag. The entire
Android source could still be built even if the framework-res.apk no
longer had the removed permission in the manifest.
Change-Id: I982a8988e35e09e73bcbe065f0d7cf47c2907d54
Diffstat (limited to 'tools')
-rw-r--r-- | tools/aapt2/cmd/Link.cpp | 9 | ||||
-rw-r--r-- | tools/aapt2/cmd/Link_test.cpp | 8 |
2 files changed, 16 insertions, 1 deletions
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index 24699bf9a7ff..c739d7732d7f 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -1987,6 +1987,8 @@ class Linker { context_->SetNameManglerPolicy(NameManglerPolicy{context_->GetCompilationPackage()}); context_->SetSplitNameDependencies(app_info_.split_name_dependencies); + std::unique_ptr<xml::XmlResource> pre_flags_filter_manifest_xml = manifest_xml->Clone(); + FeatureFlagsFilterOptions flags_filter_options; if (context_->GetMinSdkVersion() > SDK_UPSIDE_DOWN_CAKE) { // For API version > U, PackageManager will dynamically read the flag values and disable @@ -2296,7 +2298,12 @@ class Linker { } if (options_.generate_java_class_path) { - if (!WriteManifestJavaFile(manifest_xml.get())) { + // The FeatureFlagsFilter may remove <permission> and <permission-group> elements that + // generate constants in the Manifest Java file. While we want those permissions and + // permission groups removed in the SDK (i.e., if a feature flag is disabled), the + // constants should still remain so that code referencing it (e.g., within a feature + // flag check) will still compile. Therefore we use the manifest XML before the filter. + if (!WriteManifestJavaFile(pre_flags_filter_manifest_xml.get())) { error = true; } } diff --git a/tools/aapt2/cmd/Link_test.cpp b/tools/aapt2/cmd/Link_test.cpp index 7ceb351aaa6f..10d0b1f3a2e6 100644 --- a/tools/aapt2/cmd/Link_test.cpp +++ b/tools/aapt2/cmd/Link_test.cpp @@ -1021,9 +1021,11 @@ TEST_F(LinkTest, FeatureFlagDisabled_SdkAtMostUDC) { .AddContents(manifest_contents) .Build(); + const std::string app_java = GetTestPath("app-java"); auto app_link_args = LinkCommandBuilder(this) .SetManifestFile(app_manifest) .AddParameter("-I", android_apk) + .AddParameter("--java", app_java) .AddParameter("--feature-flags", "flag=false"); const std::string app_apk = GetTestPath("app.apk"); @@ -1038,6 +1040,12 @@ TEST_F(LinkTest, FeatureFlagDisabled_SdkAtMostUDC) { ASSERT_THAT(root, NotNull()); auto maybe_removed = root->FindChild({}, "permission"); ASSERT_THAT(maybe_removed, IsNull()); + + // Code for the permission should be generated even if the element is removed + const std::string manifest_java = app_java + "/com/example/app/Manifest.java"; + std::string manifest_java_contents; + ASSERT_TRUE(android::base::ReadFileToString(manifest_java, &manifest_java_contents)); + EXPECT_THAT(manifest_java_contents, HasSubstr(" public static final String FOO=\"FOO\";")); } TEST_F(LinkTest, FeatureFlagEnabled_SdkAtMostUDC) { |