Loading tools/aapt2/link/TableMerger.cpp +22 −10 Original line number Diff line number Diff line Loading @@ -138,19 +138,31 @@ static bool MergeEntry(IAaptContext* context, const Source& src, if (src_entry->overlayable_item) { if (dst_entry->overlayable_item) { CHECK(src_entry->overlayable_item.value().overlayable != nullptr); Overlayable* src_overlayable = src_entry->overlayable_item.value().overlayable.get(); CHECK(dst_entry->overlayable_item.value().overlayable != nullptr); Overlayable* dst_overlayable = dst_entry->overlayable_item.value().overlayable.get(); if (src_overlayable->name != dst_overlayable->name || src_overlayable->actor != dst_overlayable->actor || src_entry->overlayable_item.value().policies != dst_entry->overlayable_item.value().policies) { // Do not allow a resource with an overlayable declaration to have that overlayable // declaration redefined // declaration redefined. context->GetDiagnostics()->Error(DiagMessage(src_entry->overlayable_item.value().source) << "duplicate overlayable declaration for resource '" << src_entry->name << "'"); context->GetDiagnostics()->Error(DiagMessage(dst_entry->overlayable_item.value().source) << "previous declaration here"); return false; } else { dst_entry->overlayable_item = std::move(src_entry->overlayable_item); } } dst_entry->overlayable_item = std::move(src_entry->overlayable_item); } return true; } Loading tools/aapt2/link/TableMerger_test.cpp +61 −3 Original line number Diff line number Diff line Loading @@ -521,6 +521,35 @@ TEST_F(TableMergerTest, SameResourceDifferentNameFail) { .Build(); auto overlayable_second = std::make_shared<Overlayable>("ThemeResources", "overlay://customization"); OverlayableItem overlayable_item_second(overlayable_second); overlayable_item_second.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_b = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_second) .Build(); ResourceTable final_table; TableMergerOptions options; options.auto_add_overlay = true; TableMerger merger(context_.get(), &final_table, options); ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/)); ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); } TEST_F(TableMergerTest, SameResourceDifferentActorFail) { auto overlayable_first = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); OverlayableItem overlayable_item_first(overlayable_first); overlayable_item_first.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_a = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_first) .Build(); auto overlayable_second = std::make_shared<Overlayable>("CustomizableResources", "overlay://theme"); OverlayableItem overlayable_item_second(overlayable_second); overlayable_item_second.policies |= OverlayableItem::Policy::kProduct; Loading @@ -538,7 +567,36 @@ TEST_F(TableMergerTest, SameResourceDifferentNameFail) { ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); } TEST_F(TableMergerTest, SameResourceSameNameFail) { TEST_F(TableMergerTest, SameResourceDifferentPoliciesFail) { auto overlayable_first = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); OverlayableItem overlayable_item_first(overlayable_first); overlayable_item_first.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_a = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_first) .Build(); auto overlayable_second = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); OverlayableItem overlayable_item_second(overlayable_second); overlayable_item_second.policies |= OverlayableItem::Policy::kSignature; std::unique_ptr<ResourceTable> table_b = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_second) .Build(); ResourceTable final_table; TableMergerOptions options; options.auto_add_overlay = true; TableMerger merger(context_.get(), &final_table, options); ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/)); ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); } TEST_F(TableMergerTest, SameResourceSameOverlayable) { auto overlayable = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); Loading @@ -551,7 +609,7 @@ TEST_F(TableMergerTest, SameResourceSameNameFail) { .Build(); OverlayableItem overlayable_item_second(overlayable); overlayable_item_second.policies |= OverlayableItem::Policy::kSystem; overlayable_item_second.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_b = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) Loading @@ -563,7 +621,7 @@ TEST_F(TableMergerTest, SameResourceSameNameFail) { options.auto_add_overlay = true; TableMerger merger(context_.get(), &final_table, options); ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/)); ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); ASSERT_TRUE(merger.Merge({}, table_b.get(), false /*overlay*/)); } } // namespace aapt Loading
tools/aapt2/link/TableMerger.cpp +22 −10 Original line number Diff line number Diff line Loading @@ -138,19 +138,31 @@ static bool MergeEntry(IAaptContext* context, const Source& src, if (src_entry->overlayable_item) { if (dst_entry->overlayable_item) { CHECK(src_entry->overlayable_item.value().overlayable != nullptr); Overlayable* src_overlayable = src_entry->overlayable_item.value().overlayable.get(); CHECK(dst_entry->overlayable_item.value().overlayable != nullptr); Overlayable* dst_overlayable = dst_entry->overlayable_item.value().overlayable.get(); if (src_overlayable->name != dst_overlayable->name || src_overlayable->actor != dst_overlayable->actor || src_entry->overlayable_item.value().policies != dst_entry->overlayable_item.value().policies) { // Do not allow a resource with an overlayable declaration to have that overlayable // declaration redefined // declaration redefined. context->GetDiagnostics()->Error(DiagMessage(src_entry->overlayable_item.value().source) << "duplicate overlayable declaration for resource '" << src_entry->name << "'"); context->GetDiagnostics()->Error(DiagMessage(dst_entry->overlayable_item.value().source) << "previous declaration here"); return false; } else { dst_entry->overlayable_item = std::move(src_entry->overlayable_item); } } dst_entry->overlayable_item = std::move(src_entry->overlayable_item); } return true; } Loading
tools/aapt2/link/TableMerger_test.cpp +61 −3 Original line number Diff line number Diff line Loading @@ -521,6 +521,35 @@ TEST_F(TableMergerTest, SameResourceDifferentNameFail) { .Build(); auto overlayable_second = std::make_shared<Overlayable>("ThemeResources", "overlay://customization"); OverlayableItem overlayable_item_second(overlayable_second); overlayable_item_second.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_b = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_second) .Build(); ResourceTable final_table; TableMergerOptions options; options.auto_add_overlay = true; TableMerger merger(context_.get(), &final_table, options); ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/)); ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); } TEST_F(TableMergerTest, SameResourceDifferentActorFail) { auto overlayable_first = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); OverlayableItem overlayable_item_first(overlayable_first); overlayable_item_first.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_a = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_first) .Build(); auto overlayable_second = std::make_shared<Overlayable>("CustomizableResources", "overlay://theme"); OverlayableItem overlayable_item_second(overlayable_second); overlayable_item_second.policies |= OverlayableItem::Policy::kProduct; Loading @@ -538,7 +567,36 @@ TEST_F(TableMergerTest, SameResourceDifferentNameFail) { ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); } TEST_F(TableMergerTest, SameResourceSameNameFail) { TEST_F(TableMergerTest, SameResourceDifferentPoliciesFail) { auto overlayable_first = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); OverlayableItem overlayable_item_first(overlayable_first); overlayable_item_first.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_a = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_first) .Build(); auto overlayable_second = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); OverlayableItem overlayable_item_second(overlayable_second); overlayable_item_second.policies |= OverlayableItem::Policy::kSignature; std::unique_ptr<ResourceTable> table_b = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) .SetOverlayable("bool/foo", overlayable_item_second) .Build(); ResourceTable final_table; TableMergerOptions options; options.auto_add_overlay = true; TableMerger merger(context_.get(), &final_table, options); ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/)); ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); } TEST_F(TableMergerTest, SameResourceSameOverlayable) { auto overlayable = std::make_shared<Overlayable>("CustomizableResources", "overlay://customization"); Loading @@ -551,7 +609,7 @@ TEST_F(TableMergerTest, SameResourceSameNameFail) { .Build(); OverlayableItem overlayable_item_second(overlayable); overlayable_item_second.policies |= OverlayableItem::Policy::kSystem; overlayable_item_second.policies |= OverlayableItem::Policy::kProduct; std::unique_ptr<ResourceTable> table_b = test::ResourceTableBuilder() .SetPackageId("com.app.a", 0x7f) Loading @@ -563,7 +621,7 @@ TEST_F(TableMergerTest, SameResourceSameNameFail) { options.auto_add_overlay = true; TableMerger merger(context_.get(), &final_table, options); ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/)); ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/)); ASSERT_TRUE(merger.Merge({}, table_b.get(), false /*overlay*/)); } } // namespace aapt