Loading libs/androidfw/LoadedArsc.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -593,7 +593,12 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, return {}; } // Iterate over the overlayable policy chunks std::string name; util::ReadUtf16StringFromDevice(header->name, arraysize(header->name), &name); std::string actor; util::ReadUtf16StringFromDevice(header->actor, arraysize(header->actor), &actor); // Iterate over the overlayable policy chunks contained within the overlayable chunk data ChunkIterator overlayable_iter(child_chunk.data_ptr(), child_chunk.data_size()); while (overlayable_iter.HasNext()) { const Chunk overlayable_child_chunk = overlayable_iter.Next(); Loading @@ -613,7 +618,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, return {}; } // Retrieve all the ids belonging to this policy // Retrieve all the resource ids belonging to this policy chunk std::unordered_set<uint32_t> ids; const auto ids_begin = reinterpret_cast<const ResTable_ref*>(overlayable_child_chunk.data_ptr()); Loading @@ -622,8 +627,10 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, ids.insert(dtohl(id_iter->ident)); } // Add the pairing of overlayable properties to resource ids to the package // Add the pairing of overlayable properties and resource ids to the package OverlayableInfo overlayable_info{}; overlayable_info.name = name; overlayable_info.actor = actor; overlayable_info.policy_flags = policy_header->policy_flags; loaded_package->overlayable_infos_.push_back(std::make_pair(overlayable_info, ids)); break; Loading @@ -636,7 +643,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, } if (overlayable_iter.HadError()) { LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_POLICY_TYPE: %s", LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_TYPE: %s", overlayable_iter.GetLastError().c_str()); if (overlayable_iter.HadFatalError()) { return {}; Loading libs/androidfw/include/androidfw/LoadedArsc.h +2 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,8 @@ struct TypeSpec { using TypeSpecPtr = util::unique_cptr<TypeSpec>; struct OverlayableInfo { std::string name; std::string actor; uint32_t policy_flags; }; Loading libs/androidfw/include/androidfw/ResourceTypes.h +6 −0 Original line number Diff line number Diff line Loading @@ -1611,6 +1611,12 @@ struct ResTable_lib_entry struct ResTable_overlayable_header { struct ResChunk_header header; // The name of the overlayable set of resources that overlays target. uint16_t name[256]; // The component responsible for enabling and disabling overlays targeting this chunk. uint16_t actor[256]; }; /** Loading libs/androidfw/tests/LoadedArsc_test.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -294,22 +294,30 @@ TEST(LoadedArscTest, LoadOverlayable) { info = package->GetOverlayableInfo(overlayable::R::string::overlayable1); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->name, Eq("OverlayableResources1")); EXPECT_THAT(info->actor, Eq("overlay://theme")); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC)); info = package->GetOverlayableInfo(overlayable::R::string::overlayable2); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->name, Eq("OverlayableResources1")); EXPECT_THAT(info->actor, Eq("overlay://theme")); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_SYSTEM_PARTITION | ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION)); info = package->GetOverlayableInfo(overlayable::R::string::overlayable3); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->name, Eq("OverlayableResources2")); EXPECT_THAT(info->actor, Eq("overlay://com.android.overlayable")); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_VENDOR_PARTITION | ResTable_overlayable_policy_header::POLICY_PRODUCT_SERVICES_PARTITION | ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION)); info = package->GetOverlayableInfo(overlayable::R::string::overlayable4); EXPECT_THAT(info->name, Eq("OverlayableResources1")); EXPECT_THAT(info->actor, Eq("overlay://theme")); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC)); } Loading libs/androidfw/tests/data/overlayable/overlayable.apk +4.04 KiB (5.39 KiB) File changed.No diff preview for this file type. View original file View changed file Loading
libs/androidfw/LoadedArsc.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -593,7 +593,12 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, return {}; } // Iterate over the overlayable policy chunks std::string name; util::ReadUtf16StringFromDevice(header->name, arraysize(header->name), &name); std::string actor; util::ReadUtf16StringFromDevice(header->actor, arraysize(header->actor), &actor); // Iterate over the overlayable policy chunks contained within the overlayable chunk data ChunkIterator overlayable_iter(child_chunk.data_ptr(), child_chunk.data_size()); while (overlayable_iter.HasNext()) { const Chunk overlayable_child_chunk = overlayable_iter.Next(); Loading @@ -613,7 +618,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, return {}; } // Retrieve all the ids belonging to this policy // Retrieve all the resource ids belonging to this policy chunk std::unordered_set<uint32_t> ids; const auto ids_begin = reinterpret_cast<const ResTable_ref*>(overlayable_child_chunk.data_ptr()); Loading @@ -622,8 +627,10 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, ids.insert(dtohl(id_iter->ident)); } // Add the pairing of overlayable properties to resource ids to the package // Add the pairing of overlayable properties and resource ids to the package OverlayableInfo overlayable_info{}; overlayable_info.name = name; overlayable_info.actor = actor; overlayable_info.policy_flags = policy_header->policy_flags; loaded_package->overlayable_infos_.push_back(std::make_pair(overlayable_info, ids)); break; Loading @@ -636,7 +643,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, } if (overlayable_iter.HadError()) { LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_POLICY_TYPE: %s", LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_TYPE: %s", overlayable_iter.GetLastError().c_str()); if (overlayable_iter.HadFatalError()) { return {}; Loading
libs/androidfw/include/androidfw/LoadedArsc.h +2 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,8 @@ struct TypeSpec { using TypeSpecPtr = util::unique_cptr<TypeSpec>; struct OverlayableInfo { std::string name; std::string actor; uint32_t policy_flags; }; Loading
libs/androidfw/include/androidfw/ResourceTypes.h +6 −0 Original line number Diff line number Diff line Loading @@ -1611,6 +1611,12 @@ struct ResTable_lib_entry struct ResTable_overlayable_header { struct ResChunk_header header; // The name of the overlayable set of resources that overlays target. uint16_t name[256]; // The component responsible for enabling and disabling overlays targeting this chunk. uint16_t actor[256]; }; /** Loading
libs/androidfw/tests/LoadedArsc_test.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -294,22 +294,30 @@ TEST(LoadedArscTest, LoadOverlayable) { info = package->GetOverlayableInfo(overlayable::R::string::overlayable1); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->name, Eq("OverlayableResources1")); EXPECT_THAT(info->actor, Eq("overlay://theme")); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC)); info = package->GetOverlayableInfo(overlayable::R::string::overlayable2); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->name, Eq("OverlayableResources1")); EXPECT_THAT(info->actor, Eq("overlay://theme")); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_SYSTEM_PARTITION | ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION)); info = package->GetOverlayableInfo(overlayable::R::string::overlayable3); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->name, Eq("OverlayableResources2")); EXPECT_THAT(info->actor, Eq("overlay://com.android.overlayable")); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_VENDOR_PARTITION | ResTable_overlayable_policy_header::POLICY_PRODUCT_SERVICES_PARTITION | ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION)); info = package->GetOverlayableInfo(overlayable::R::string::overlayable4); EXPECT_THAT(info->name, Eq("OverlayableResources1")); EXPECT_THAT(info->actor, Eq("overlay://theme")); ASSERT_THAT(info, NotNull()); EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC)); } Loading
libs/androidfw/tests/data/overlayable/overlayable.apk +4.04 KiB (5.39 KiB) File changed.No diff preview for this file type. View original file View changed file