From 8947def237dc1ad11bfcc8a0c9172d4093f1b186 Mon Sep 17 00:00:00 2001 From: felkachang Date: Fri, 1 Jul 2022 15:18:10 +0800 Subject: [PATCH] Prevent overlayable resources from being obfuscated Once the build process finds one overlayable resource entry is not in the list of collapse name exemption, the build process outputs the resource name automatically and gives a warning message to notify the developers. Bug: 228192695 Test: atest aapt2_test Change-Id: I989b75343d803b059c902baa088590fce7237211 --- tools/aapt2/format/binary/TableFlattener.cpp | 18 ++++++- .../format/binary/TableFlattener_test.cpp | 48 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/tools/aapt2/format/binary/TableFlattener.cpp b/tools/aapt2/format/binary/TableFlattener.cpp index cd07b1ebbf924..46a846bce35fc 100644 --- a/tools/aapt2/format/binary/TableFlattener.cpp +++ b/tools/aapt2/format/binary/TableFlattener.cpp @@ -641,7 +641,23 @@ class PackageFlattener { local_key_index = (uint32_t)key_pool_.MakeRef(entry.name).index(); } else { // resource isn't exempt from collapse, add it as obfuscated value - local_key_index = (uint32_t)key_pool_.MakeRef(obfuscated_resource_name).index(); + if (entry.overlayable_item) { + // if the resource name of the specific entry is obfuscated and this + // entry is in the overlayable list, the overlay can't work on this + // overlayable at runtime because the name has been obfuscated in + // resources.arsc during flatten operation. + const OverlayableItem& item = entry.overlayable_item.value(); + context_->GetDiagnostics()->Warn(android::DiagMessage(item.overlayable->source) + << "The resource name of overlayable entry " + << resource_name.to_string() << "'" + << " shouldn't be obfuscated in resources.arsc"); + + local_key_index = (uint32_t)key_pool_.MakeRef(entry.name).index(); + } else { + // TODO(b/228192695): output the entry.name and Resource id to make + // de-obfuscated possible. + local_key_index = (uint32_t)key_pool_.MakeRef(obfuscated_resource_name).index(); + } } // Group values by configuration. for (auto& config_value : entry.values) { diff --git a/tools/aapt2/format/binary/TableFlattener_test.cpp b/tools/aapt2/format/binary/TableFlattener_test.cpp index 1dd2468b58683..e48fca61fef80 100644 --- a/tools/aapt2/format/binary/TableFlattener_test.cpp +++ b/tools/aapt2/format/binary/TableFlattener_test.cpp @@ -878,4 +878,52 @@ TEST_F(TableFlattenerTest, FlattenCustomResourceTypes) { Res_value::TYPE_STRING, (uint32_t)*idx, 0u)); } +TEST_F(TableFlattenerTest, FlattenTypeEntryWithNameCollapseNotInExemption) { + OverlayableItem overlayable_item(std::make_shared("TestName", "overlay://theme")); + overlayable_item.policies |= PolicyFlags::PUBLIC; + + std::string name = "com.app.test:color/overlayable_color"; + std::unique_ptr table = + test::ResourceTableBuilder() + .AddValue("com.app.test:color/overlayable_color", ResourceId(0x7f010000), + util::make_unique(uint8_t(Res_value::TYPE_INT_COLOR_ARGB8), + 0xffaabbcc)) + .SetOverlayable(name, overlayable_item) + .Build(); + + TableFlattenerOptions options; + options.collapse_key_stringpool = true; + + ResTable res_table; + EXPECT_THAT(Flatten(context_.get(), options, table.get(), &res_table), testing::IsTrue()); + EXPECT_THAT(Exists(&res_table, "com.app.test:color/overlayable_color", ResourceId(0x7f010000), {}, + Res_value::TYPE_INT_COLOR_ARGB8, 0xffaabbcc, 0u), + testing::IsTrue()); +} + +TEST_F(TableFlattenerTest, FlattenTypeEntryWithNameCollapseInExemption) { + OverlayableItem overlayable_item(std::make_shared("TestName", "overlay://theme")); + overlayable_item.policies |= PolicyFlags::PUBLIC; + + std::string name = "com.app.test:color/overlayable_color"; + std::unique_ptr table = + test::ResourceTableBuilder() + .AddValue("com.app.test:color/overlayable_color", ResourceId(0x7f010000), + util::make_unique(uint8_t(Res_value::TYPE_INT_COLOR_ARGB8), + 0xffaabbcc)) + .SetOverlayable(name, overlayable_item) + .Build(); + + TableFlattenerOptions options; + options.collapse_key_stringpool = true; + options.name_collapse_exemptions.insert( + ResourceName({}, ResourceType::kColor, "overlayable_color")); + + ResTable res_table; + EXPECT_THAT(Flatten(context_.get(), options, table.get(), &res_table), testing::IsTrue()); + EXPECT_THAT(Exists(&res_table, "com.app.test:color/overlayable_color", ResourceId(0x7f010000), {}, + Res_value::TYPE_INT_COLOR_ARGB8, 0xffaabbcc, 0u), + testing::IsTrue()); +} + } // namespace aapt