AAPT2: Fix resource table load time regression
A previous change (deee395) caused duplicate entries to be created for
entries eith entry ids greater than 0x0ff. This is because the wrong
data type was used (uint8_t instead of uint16_t). This made loading in
resources slower as well since more entries had to be iterated over.
Bug: 36051266
Test: Dumping all resources in 700 apks found in the android tree took 1
minute instead of 5 minutes. Created a test in aapt2_tests.
Change-Id: I1c3d830da517a56ac3496221dbe605c72e0c6014
diff --git a/tools/aapt2/ResourceTable_test.cpp b/tools/aapt2/ResourceTable_test.cpp
index 7fa8ea2..1aa9751 100644
--- a/tools/aapt2/ResourceTable_test.cpp
+++ b/tools/aapt2/ResourceTable_test.cpp
@@ -258,4 +258,44 @@
ASSERT_FALSE(table.SetOverlayable(name, overlayable, test::GetDiagnostics()));
}
+TEST(ResourceTableTest, AllowDuplictaeResourcesNames) {
+ ResourceTable table(/* validate_resources */ false);
+
+ const ResourceName foo_name = test::ParseNameOrDie("android:bool/foo");
+ ASSERT_TRUE(table.AddResourceWithId(foo_name, ResourceId(0x7f0100ff), ConfigDescription{} , "",
+ test::BuildPrimitive(android::Res_value::TYPE_INT_BOOLEAN, 0),
+ test::GetDiagnostics()));
+ ASSERT_TRUE(table.AddResourceWithId(foo_name, ResourceId(0x7f010100), ConfigDescription{} , "",
+ test::BuildPrimitive(android::Res_value::TYPE_INT_BOOLEAN, 1),
+ test::GetDiagnostics()));
+
+ ASSERT_TRUE(table.SetVisibilityWithId(foo_name, Visibility{Visibility::Level::kPublic},
+ ResourceId(0x7f0100ff), test::GetDiagnostics()));
+ ASSERT_TRUE(table.SetVisibilityWithId(foo_name, Visibility{Visibility::Level::kPrivate},
+ ResourceId(0x7f010100), test::GetDiagnostics()));
+
+ auto package = table.FindPackageById(0x7f);
+ ASSERT_THAT(package, NotNull());
+ auto type = package->FindType(ResourceType::kBool);
+ ASSERT_THAT(type, NotNull());
+
+ auto entry1 = type->FindEntry("foo", 0x00ff);
+ ASSERT_THAT(entry1, NotNull());
+ ASSERT_THAT(entry1->id, Eq(0x00ff));
+ ASSERT_THAT(entry1->values[0], NotNull());
+ ASSERT_THAT(entry1->values[0]->value, NotNull());
+ ASSERT_THAT(ValueCast<BinaryPrimitive>(entry1->values[0]->value.get()), NotNull());
+ ASSERT_THAT(ValueCast<BinaryPrimitive>(entry1->values[0]->value.get())->value.data, Eq(0u));
+ ASSERT_THAT(entry1->visibility.level, Visibility::Level::kPublic);
+
+ auto entry2 = type->FindEntry("foo", 0x0100);
+ ASSERT_THAT(entry2, NotNull());
+ ASSERT_THAT(entry2->id, Eq(0x0100));
+ ASSERT_THAT(entry2->values[0], NotNull());
+ ASSERT_THAT(entry1->values[0]->value, NotNull());
+ ASSERT_THAT(ValueCast<BinaryPrimitive>(entry2->values[0]->value.get()), NotNull());
+ ASSERT_THAT(ValueCast<BinaryPrimitive>(entry2->values[0]->value.get())->value.data, Eq(1u));
+ ASSERT_THAT(entry2->visibility.level, Visibility::Level::kPrivate);
+}
+
} // namespace aapt