Merge "Prevent overlayable resources from being obfuscated"
This commit is contained in:
committed by
Android (Google) Code Review
commit
0e2eb0e94c
@@ -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) {
|
||||
|
||||
@@ -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<Overlayable>("TestName", "overlay://theme"));
|
||||
overlayable_item.policies |= PolicyFlags::PUBLIC;
|
||||
|
||||
std::string name = "com.app.test:color/overlayable_color";
|
||||
std::unique_ptr<ResourceTable> table =
|
||||
test::ResourceTableBuilder()
|
||||
.AddValue("com.app.test:color/overlayable_color", ResourceId(0x7f010000),
|
||||
util::make_unique<BinaryPrimitive>(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<Overlayable>("TestName", "overlay://theme"));
|
||||
overlayable_item.policies |= PolicyFlags::PUBLIC;
|
||||
|
||||
std::string name = "com.app.test:color/overlayable_color";
|
||||
std::unique_ptr<ResourceTable> table =
|
||||
test::ResourceTableBuilder()
|
||||
.AddValue("com.app.test:color/overlayable_color", ResourceId(0x7f010000),
|
||||
util::make_unique<BinaryPrimitive>(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
|
||||
|
||||
Reference in New Issue
Block a user