Loading libs/androidfw/AssetManager2.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -637,6 +637,7 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid, std::vector<uint32_t>& new_entry->key = new_key; new_entry->key_pool = nullptr; new_entry->type_pool = nullptr; new_entry->style = resid; new_entry->value.copyFrom_dtoh(map_entry->value); status_t err = entry.dynamic_ref_table->lookupResourceValue(&new_entry->value); if (err != NO_ERROR) { Loading Loading @@ -695,6 +696,7 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid, std::vector<uint32_t>& new_entry->key_pool = nullptr; new_entry->type_pool = nullptr; new_entry->value.copyFrom_dtoh(map_entry->value); new_entry->style = resid; status_t err = entry.dynamic_ref_table->lookupResourceValue(&new_entry->value); if (err != NO_ERROR) { LOG(ERROR) << base::StringPrintf( Loading Loading @@ -731,6 +733,7 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid, std::vector<uint32_t>& new_entry->key_pool = nullptr; new_entry->type_pool = nullptr; new_entry->value.copyFrom_dtoh(map_entry->value); new_entry->style = resid; status_t err = entry.dynamic_ref_table->lookupResourceValue(&new_entry->value); if (err != NO_ERROR) { LOG(ERROR) << base::StringPrintf("Failed to resolve value t=0x%02x d=0x%08x for key 0x%08x.", Loading libs/androidfw/AttributeResolution.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -310,7 +310,8 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, type_set_flags = style_flags; value = entry->value; if (kDebugStyles) { ALOGI("-> From style: type=0x%x, data=0x%08x", value.dataType, value.data); ALOGI("-> From style: type=0x%x, data=0x%08x, style=0x%08x", value.dataType, value.data, entry->style); } } } Loading Loading @@ -388,7 +389,6 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, // out_indices must NOT be nullptr. out_indices[indices_idx] = ii; } out_values += STYLE_NUM_ENTRIES; } Loading libs/androidfw/include/androidfw/AssetManager2.h +3 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,9 @@ struct ResolvedBag { Res_value value; // The resource ID of the origin style associated with the given entry. uint32_t style; // Which ApkAssets this entry came from. ApkAssetsCookie cookie; Loading libs/androidfw/tests/AssetManager2_test.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -298,11 +298,13 @@ TEST_F(AssetManager2Test, MergesStylesWithParentFromSingleApkAssets) { EXPECT_EQ(Res_value::TYPE_INT_DEC, bag_two->entries[0].value.dataType); EXPECT_EQ(1u, bag_two->entries[0].value.data); EXPECT_EQ(0, bag_two->entries[0].cookie); EXPECT_EQ(app::R::style::StyleOne, bag_two->entries[0].style); // attr_two should be overridden from StyleOne by StyleTwo. EXPECT_EQ(app::R::attr::attr_two, bag_two->entries[1].key); EXPECT_EQ(Res_value::TYPE_STRING, bag_two->entries[1].value.dataType); EXPECT_EQ(0, bag_two->entries[1].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[1].style); EXPECT_EQ(std::string("string"), GetStringFromPool(assetmanager.GetStringPoolForCookie(0), bag_two->entries[1].value.data)); Loading @@ -312,21 +314,25 @@ TEST_F(AssetManager2Test, MergesStylesWithParentFromSingleApkAssets) { EXPECT_EQ(Res_value::TYPE_ATTRIBUTE, bag_two->entries[2].value.dataType); EXPECT_EQ(app::R::attr::attr_indirect, bag_two->entries[2].value.data); EXPECT_EQ(0, bag_two->entries[2].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[2].style); EXPECT_EQ(app::R::attr::attr_five, bag_two->entries[3].key); EXPECT_EQ(Res_value::TYPE_REFERENCE, bag_two->entries[3].value.dataType); EXPECT_EQ(app::R::string::string_one, bag_two->entries[3].value.data); EXPECT_EQ(0, bag_two->entries[3].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[3].style); EXPECT_EQ(app::R::attr::attr_indirect, bag_two->entries[4].key); EXPECT_EQ(Res_value::TYPE_INT_DEC, bag_two->entries[4].value.dataType); EXPECT_EQ(3u, bag_two->entries[4].value.data); EXPECT_EQ(0, bag_two->entries[4].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[4].style); EXPECT_EQ(app::R::attr::attr_empty, bag_two->entries[5].key); EXPECT_EQ(Res_value::TYPE_NULL, bag_two->entries[5].value.dataType); EXPECT_EQ(Res_value::DATA_NULL_EMPTY, bag_two->entries[5].value.data); EXPECT_EQ(0, bag_two->entries[5].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[5].style); } TEST_F(AssetManager2Test, MergeStylesCircularDependency) { Loading Loading
libs/androidfw/AssetManager2.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -637,6 +637,7 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid, std::vector<uint32_t>& new_entry->key = new_key; new_entry->key_pool = nullptr; new_entry->type_pool = nullptr; new_entry->style = resid; new_entry->value.copyFrom_dtoh(map_entry->value); status_t err = entry.dynamic_ref_table->lookupResourceValue(&new_entry->value); if (err != NO_ERROR) { Loading Loading @@ -695,6 +696,7 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid, std::vector<uint32_t>& new_entry->key_pool = nullptr; new_entry->type_pool = nullptr; new_entry->value.copyFrom_dtoh(map_entry->value); new_entry->style = resid; status_t err = entry.dynamic_ref_table->lookupResourceValue(&new_entry->value); if (err != NO_ERROR) { LOG(ERROR) << base::StringPrintf( Loading Loading @@ -731,6 +733,7 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid, std::vector<uint32_t>& new_entry->key_pool = nullptr; new_entry->type_pool = nullptr; new_entry->value.copyFrom_dtoh(map_entry->value); new_entry->style = resid; status_t err = entry.dynamic_ref_table->lookupResourceValue(&new_entry->value); if (err != NO_ERROR) { LOG(ERROR) << base::StringPrintf("Failed to resolve value t=0x%02x d=0x%08x for key 0x%08x.", Loading
libs/androidfw/AttributeResolution.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -310,7 +310,8 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, type_set_flags = style_flags; value = entry->value; if (kDebugStyles) { ALOGI("-> From style: type=0x%x, data=0x%08x", value.dataType, value.data); ALOGI("-> From style: type=0x%x, data=0x%08x, style=0x%08x", value.dataType, value.data, entry->style); } } } Loading Loading @@ -388,7 +389,6 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, // out_indices must NOT be nullptr. out_indices[indices_idx] = ii; } out_values += STYLE_NUM_ENTRIES; } Loading
libs/androidfw/include/androidfw/AssetManager2.h +3 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,9 @@ struct ResolvedBag { Res_value value; // The resource ID of the origin style associated with the given entry. uint32_t style; // Which ApkAssets this entry came from. ApkAssetsCookie cookie; Loading
libs/androidfw/tests/AssetManager2_test.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -298,11 +298,13 @@ TEST_F(AssetManager2Test, MergesStylesWithParentFromSingleApkAssets) { EXPECT_EQ(Res_value::TYPE_INT_DEC, bag_two->entries[0].value.dataType); EXPECT_EQ(1u, bag_two->entries[0].value.data); EXPECT_EQ(0, bag_two->entries[0].cookie); EXPECT_EQ(app::R::style::StyleOne, bag_two->entries[0].style); // attr_two should be overridden from StyleOne by StyleTwo. EXPECT_EQ(app::R::attr::attr_two, bag_two->entries[1].key); EXPECT_EQ(Res_value::TYPE_STRING, bag_two->entries[1].value.dataType); EXPECT_EQ(0, bag_two->entries[1].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[1].style); EXPECT_EQ(std::string("string"), GetStringFromPool(assetmanager.GetStringPoolForCookie(0), bag_two->entries[1].value.data)); Loading @@ -312,21 +314,25 @@ TEST_F(AssetManager2Test, MergesStylesWithParentFromSingleApkAssets) { EXPECT_EQ(Res_value::TYPE_ATTRIBUTE, bag_two->entries[2].value.dataType); EXPECT_EQ(app::R::attr::attr_indirect, bag_two->entries[2].value.data); EXPECT_EQ(0, bag_two->entries[2].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[2].style); EXPECT_EQ(app::R::attr::attr_five, bag_two->entries[3].key); EXPECT_EQ(Res_value::TYPE_REFERENCE, bag_two->entries[3].value.dataType); EXPECT_EQ(app::R::string::string_one, bag_two->entries[3].value.data); EXPECT_EQ(0, bag_two->entries[3].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[3].style); EXPECT_EQ(app::R::attr::attr_indirect, bag_two->entries[4].key); EXPECT_EQ(Res_value::TYPE_INT_DEC, bag_two->entries[4].value.dataType); EXPECT_EQ(3u, bag_two->entries[4].value.data); EXPECT_EQ(0, bag_two->entries[4].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[4].style); EXPECT_EQ(app::R::attr::attr_empty, bag_two->entries[5].key); EXPECT_EQ(Res_value::TYPE_NULL, bag_two->entries[5].value.dataType); EXPECT_EQ(Res_value::DATA_NULL_EMPTY, bag_two->entries[5].value.data); EXPECT_EQ(0, bag_two->entries[5].cookie); EXPECT_EQ(app::R::style::StyleTwo, bag_two->entries[5].style); } TEST_F(AssetManager2Test, MergeStylesCircularDependency) { Loading