From 198234502b45449bd3a1e18ba22e8ffd1267657a Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 29 Jan 2019 12:01:24 -0800 Subject: [PATCH] Enforce overlayable API when defined If a package defines overlayable resources, then do not allow resources that are not defined as overlayable to be overlaid. Bug:123600120 Test: idmap2_tests and cts-tradefed run cts -m CtsRROTestCases Change-Id: I35120a97ccf4650e67c7ba65a60f4f3c51b0e627 --- cmds/idmap2/Android.bp | 4 +- cmds/idmap2/libidmap2/Idmap.cpp | 4 +- cmds/idmap2/tests/FileUtilsTests.cpp | 27 +++-- cmds/idmap2/tests/Idmap2BinaryTests.cpp | 14 +++ cmds/idmap2/tests/IdmapTests.cpp | 107 ++++++++++++++++-- .../tests/data/overlay/AndroidManifest.xml | 3 +- .../data/overlay/AndroidManifestNoName.xml | 21 ++++ .../overlay/AndroidManifestNoNameStatic.xml | 24 ++++ .../data/overlay/AndroidManifestStatic1.xml | 1 + .../data/overlay/AndroidManifestStatic2.xml | 1 + cmds/idmap2/tests/data/overlay/build | 14 +++ .../data/overlay/overlay-no-name-static.apk | Bin 0 -> 1643 bytes .../tests/data/overlay/overlay-no-name.apk | Bin 0 -> 1567 bytes .../tests/data/overlay/overlay-static-1.apk | Bin 1599 -> 1643 bytes .../tests/data/overlay/overlay-static-2.apk | Bin 1599 -> 1643 bytes cmds/idmap2/tests/data/overlay/overlay.apk | Bin 1559 -> 1595 bytes .../data/system-overlay/AndroidManifest.xml | 7 +- .../data/system-overlay/system-overlay.apk | Bin 1283 -> 1319 bytes cmds/idmap2/tests/data/target/build | 4 + .../data/target/target-no-overlayable.apk | Bin 0 -> 2075 bytes libs/androidfw/LoadedArsc.cpp | 1 + libs/androidfw/include/androidfw/LoadedArsc.h | 10 +- 22 files changed, 212 insertions(+), 30 deletions(-) create mode 100644 cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml create mode 100644 cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml create mode 100644 cmds/idmap2/tests/data/overlay/overlay-no-name-static.apk create mode 100644 cmds/idmap2/tests/data/overlay/overlay-no-name.apk create mode 100644 cmds/idmap2/tests/data/target/target-no-overlayable.apk diff --git a/cmds/idmap2/Android.bp b/cmds/idmap2/Android.bp index 803f83c0bc6f0..056add5c71b57 100644 --- a/cmds/idmap2/Android.bp +++ b/cmds/idmap2/Android.bp @@ -16,11 +16,11 @@ cc_defaults { name: "idmap2_defaults", tidy: true, tidy_checks: [ + "modernize-*", + "-modernize-avoid-c-arrays", "android-*", "misc-*", - "modernize-*", "readability-*", - "-modernize-avoid-c-arrays", ], tidy_flags: [ "-system-headers", diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp index 5d449e96663e1..fa5ac8ea11dcb 100644 --- a/cmds/idmap2/libidmap2/Idmap.cpp +++ b/cmds/idmap2/libidmap2/Idmap.cpp @@ -281,10 +281,10 @@ bool CheckOverlayable(const LoadedPackage& target_package, if (overlayable_info == nullptr) { // If the resource does not have an overlayable definition, allow the resource to be overlaid. // Once overlayable enforcement is turned on, this check will return false. - return true; + return !target_package.DefinesOverlayable(); } - if (!overlay_info.target_name.empty() && overlay_info.target_name != overlayable_info->name) { + if (overlay_info.target_name != overlayable_info->name) { // If the overlay supplies a target overlayable name, the resource must belong to the // overlayable defined with the specified name to be overlaid. return false; diff --git a/cmds/idmap2/tests/FileUtilsTests.cpp b/cmds/idmap2/tests/FileUtilsTests.cpp index 45f84fe341ccf..8514e12e8c171 100644 --- a/cmds/idmap2/tests/FileUtilsTests.cpp +++ b/cmds/idmap2/tests/FileUtilsTests.cpp @@ -40,9 +40,14 @@ TEST(FileUtilsTests, FindFilesFindEverythingNonRecursive) { const std::string& path ATTRIBUTE_UNUSED) -> bool { return true; }); ASSERT_THAT(v, NotNull()); ASSERT_EQ(v->size(), 6U); - ASSERT_EQ(std::set(v->begin(), v->end()), - std::set({root + "/.", root + "/..", root + "/overlay", root + "/target", - root + "/system-overlay", root + "/system-overlay-invalid"})); + ASSERT_EQ(std::set(v->begin(), v->end()), std::set({ + root + "/.", + root + "/..", + root + "/overlay", + root + "/target", + root + "/system-overlay", + root + "/system-overlay-invalid", + })); } TEST(FileUtilsTests, FindFilesFindApkFilesRecursive) { @@ -51,13 +56,15 @@ TEST(FileUtilsTests, FindFilesFindApkFilesRecursive) { return type == DT_REG && path.size() > 4 && path.compare(path.size() - 4, 4, ".apk") == 0; }); ASSERT_THAT(v, NotNull()); - ASSERT_EQ(v->size(), 6U); - ASSERT_EQ(std::set(v->begin(), v->end()), - std::set({root + "/target/target.apk", root + "/overlay/overlay.apk", - root + "/overlay/overlay-static-1.apk", - root + "/overlay/overlay-static-2.apk", - root + "/system-overlay/system-overlay.apk", - root + "/system-overlay-invalid/system-overlay-invalid.apk"})); + ASSERT_EQ(v->size(), 9U); + ASSERT_EQ( + std::set(v->begin(), v->end()), + std::set( + {root + "/target/target.apk", root + "/target/target-no-overlayable.apk", + root + "/overlay/overlay.apk", root + "/overlay/overlay-no-name.apk", + root + "/overlay/overlay-no-name-static.apk", root + "/overlay/overlay-static-1.apk", + root + "/overlay/overlay-static-2.apk", root + "/system-overlay/system-overlay.apk", + root + "/system-overlay-invalid/system-overlay-invalid.apk"})); } TEST(FileUtilsTests, ReadFile) { diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp index c550eafe5ffe3..1216f9ec736a1 100644 --- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp +++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp @@ -163,8 +163,12 @@ TEST_F(Idmap2BinaryTests, Dump) { TEST_F(Idmap2BinaryTests, Scan) { SKIP_TEST_IF_CANT_EXEC_IDMAP2; + const std::string overlay_static_no_name_apk_path = + GetTestDataPath() + "/overlay/overlay-no-name-static.apk"; const std::string overlay_static_1_apk_path = GetTestDataPath() + "/overlay/overlay-static-1.apk"; const std::string overlay_static_2_apk_path = GetTestDataPath() + "/overlay/overlay-static-2.apk"; + const std::string idmap_static_no_name_path = + Idmap::CanonicalIdmapPathFor(GetTempDirPath(), overlay_static_no_name_apk_path); const std::string idmap_static_1_path = Idmap::CanonicalIdmapPathFor(GetTempDirPath(), overlay_static_1_apk_path); const std::string idmap_static_2_path = @@ -184,11 +188,18 @@ TEST_F(Idmap2BinaryTests, Scan) { ASSERT_THAT(result, NotNull()); ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr; std::stringstream expected; + expected << idmap_static_no_name_path << std::endl; expected << idmap_static_1_path << std::endl; expected << idmap_static_2_path << std::endl; ASSERT_EQ(result->stdout, expected.str()); std::stringstream error; + auto idmap_static_no_name_raw_string = utils::ReadFile(idmap_static_no_name_path); + auto idmap_static_no_name_raw_stream = std::istringstream(*idmap_static_no_name_raw_string); + auto idmap_static_no_name = Idmap::FromBinaryStream(idmap_static_no_name_raw_stream, error); + ASSERT_THAT(idmap_static_no_name, NotNull()); + ASSERT_IDMAP(*idmap_static_no_name, GetTargetApkPath(), overlay_static_no_name_apk_path); + auto idmap_static_1_raw_string = utils::ReadFile(idmap_static_1_path); auto idmap_static_1_raw_stream = std::istringstream(*idmap_static_1_raw_string); auto idmap_static_1 = Idmap::FromBinaryStream(idmap_static_1_raw_stream, error); @@ -201,6 +212,7 @@ TEST_F(Idmap2BinaryTests, Scan) { ASSERT_THAT(idmap_static_2, NotNull()); ASSERT_IDMAP(*idmap_static_2, GetTargetApkPath(), overlay_static_2_apk_path); + unlink(idmap_static_no_name_path.c_str()); unlink(idmap_static_2_path.c_str()); unlink(idmap_static_1_path.c_str()); @@ -218,6 +230,7 @@ TEST_F(Idmap2BinaryTests, Scan) { ASSERT_THAT(result, NotNull()); ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr; ASSERT_EQ(result->stdout, expected.str()); + unlink(idmap_static_no_name_path.c_str()); unlink(idmap_static_2_path.c_str()); unlink(idmap_static_1_path.c_str()); @@ -236,6 +249,7 @@ TEST_F(Idmap2BinaryTests, Scan) { ASSERT_THAT(result, NotNull()); ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr; ASSERT_EQ(result->stdout, expected.str()); + unlink(idmap_static_no_name_path.c_str()); unlink(idmap_static_2_path.c_str()); unlink(idmap_static_1_path.c_str()); diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp index df28918ac9b4f..9e27ccd7cfbb2 100644 --- a/cmds/idmap2/tests/IdmapTests.cpp +++ b/cmds/idmap2/tests/IdmapTests.cpp @@ -224,7 +224,8 @@ TEST(IdmapTests, CreateIdmapFromApkAssets) { ASSERT_EQ(types[1]->GetEntry(3), 0x0002U); } -TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublic) { +// Overlays should abide by all overlayable restrictions if enforcement of overlayable is enabled. +TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublic) { const std::string target_apk_path(GetTestDataPath() + "/target/target.apk"); std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); ASSERT_THAT(target_apk, NotNull()); @@ -260,7 +261,8 @@ TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublic) { ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_system_vendor } -TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { +// Overlays should abide by all overlayable restrictions if enforcement of overlayable is enabled. +TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { const std::string target_apk_path(GetTestDataPath() + "/target/target.apk"); std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); ASSERT_THAT(target_apk, NotNull()); @@ -290,17 +292,15 @@ TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); - ASSERT_EQ(types[0]->GetEntryCount(), 6U); - ASSERT_EQ(types[0]->GetEntryOffset(), 3U); - ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable - ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/other - ASSERT_EQ(types[0]->GetEntry(2), kNoEntry); // string/policy_product - ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_public - ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/policy_system - ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system_vendor + ASSERT_EQ(types[0]->GetEntryCount(), 3U); + ASSERT_EQ(types[0]->GetEntryOffset(), 6U); + ASSERT_EQ(types[0]->GetEntry(0), 0x0003U); // string/policy_public + ASSERT_EQ(types[0]->GetEntry(1), 0x0004U); // string/policy_system + ASSERT_EQ(types[0]->GetEntry(2), 0x0005U); // string/policy_system_vendor } -TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalidIgnoreOverlayable) { +// Overlays should ignore all overlayable restrictions if enforcement of overlayable is disabled. +TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalidIgnoreOverlayable) { const std::string target_apk_path(GetTestDataPath() + "/target/target.apk"); std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); ASSERT_THAT(target_apk, NotNull()); @@ -340,6 +340,91 @@ TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalidIgnoreOverlaya ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system_vendor } +// The resources of APKs that do not include an overlayable declaration should not restrict what +// resources can be overlaid. +TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsNoDefinedOverlayable) { + const std::string target_apk_path(GetTestDataPath() + "/target/target-no-overlayable.apk"); + std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); + ASSERT_THAT(target_apk, NotNull()); + + const std::string overlay_apk_path(GetTestDataPath() + + "/system-overlay-invalid/system-overlay-invalid.apk"); + std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); + ASSERT_THAT(overlay_apk, NotNull()); + + std::stringstream error; + std::unique_ptr idmap = + Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, + PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error); + ASSERT_THAT(idmap, NotNull()); + + const std::vector>& dataBlocks = idmap->GetData(); + ASSERT_EQ(dataBlocks.size(), 1U); + + const std::unique_ptr& data = dataBlocks[0]; + + ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU); + ASSERT_EQ(data->GetHeader()->GetTypeCount(), 1U); + + const std::vector>& types = data->GetTypeEntries(); + ASSERT_EQ(types.size(), 1U); + + ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U); + ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); + ASSERT_EQ(types[0]->GetEntryCount(), 6U); + ASSERT_EQ(types[0]->GetEntryOffset(), 3U); + ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable + ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/other + ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_product + ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_public + ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/policy_system + ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system_vendor +} + +// The resources of APKs that do not include an overlayable declaration should not restrict what +// resources can be overlaid. +TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsNoDefinedOverlayableAndNoTargetName) { + const std::string target_apk_path(GetTestDataPath() + "/target/target-no-overlayable.apk"); + std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); + ASSERT_THAT(target_apk, NotNull()); + + const std::string overlay_apk_path(GetTestDataPath() + "/overlay/overlay-no-name.apk"); + std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); + ASSERT_THAT(overlay_apk, NotNull()); + + std::stringstream error; + std::unique_ptr idmap = + Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, + PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error); + ASSERT_THAT(idmap, NotNull()); + + const std::vector>& dataBlocks = idmap->GetData(); + ASSERT_EQ(dataBlocks.size(), 1U); + + const std::unique_ptr& data = dataBlocks[0]; + + ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU); + ASSERT_EQ(data->GetHeader()->GetTypeCount(), 2U); + + const std::vector>& types = data->GetTypeEntries(); + ASSERT_EQ(types.size(), 2U); + + ASSERT_EQ(types[0]->GetTargetTypeId(), 0x01U); + ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); + ASSERT_EQ(types[0]->GetEntryCount(), 1U); + ASSERT_EQ(types[0]->GetEntryOffset(), 0U); + ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); + + ASSERT_EQ(types[1]->GetTargetTypeId(), 0x02U); + ASSERT_EQ(types[1]->GetOverlayTypeId(), 0x02U); + ASSERT_EQ(types[1]->GetEntryCount(), 4U); + ASSERT_EQ(types[1]->GetEntryOffset(), 9U); + ASSERT_EQ(types[1]->GetEntry(0), 0x0000U); + ASSERT_EQ(types[1]->GetEntry(1), kNoEntry); + ASSERT_EQ(types[1]->GetEntry(2), 0x0001U); + ASSERT_EQ(types[1]->GetEntry(3), 0x0002U); +} + TEST(IdmapTests, FailToCreateIdmapFromApkAssetsIfPathTooLong) { std::string target_apk_path(GetTestDataPath()); for (int i = 0; i < 32; i++) { diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifest.xml b/cmds/idmap2/tests/data/overlay/AndroidManifest.xml index 9f89d3121a828..a7767a6d35e6c 100644 --- a/cmds/idmap2/tests/data/overlay/AndroidManifest.xml +++ b/cmds/idmap2/tests/data/overlay/AndroidManifest.xml @@ -17,5 +17,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="test.overlay"> + android:targetPackage="test.target" + android:targetName="TestResources"/> diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml new file mode 100644 index 0000000000000..bc6b733e849fa --- /dev/null +++ b/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml new file mode 100644 index 0000000000000..ed327ce0e630f --- /dev/null +++ b/cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml index 39336cc7e76b3..1c4dae6cf69c7 100644 --- a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml +++ b/cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml @@ -18,6 +18,7 @@ package="test.overlay.static1"> diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml index e1cc1758d8cc9..70efc86036708 100644 --- a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml +++ b/cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml @@ -18,6 +18,7 @@ package="test.overlay.static2"> diff --git a/cmds/idmap2/tests/data/overlay/build b/cmds/idmap2/tests/data/overlay/build index cba108674005b..e60da803388bc 100644 --- a/cmds/idmap2/tests/data/overlay/build +++ b/cmds/idmap2/tests/data/overlay/build @@ -23,6 +23,20 @@ aapt2 link \ -o overlay.apk \ compiled.flata +aapt2 link \ + --no-resource-removal \ + -I "$FRAMEWORK_RES_APK" \ + --manifest AndroidManifestNoName.xml \ + -o overlay-no-name.apk \ + compiled.flata + +aapt2 link \ + --no-resource-removal \ + -I "$FRAMEWORK_RES_APK" \ + --manifest AndroidManifestNoNameStatic.xml \ + -o overlay-no-name-static.apk \ + compiled.flata + aapt2 link \ --no-resource-removal \ -I "$FRAMEWORK_RES_APK" \ diff --git a/cmds/idmap2/tests/data/overlay/overlay-no-name-static.apk b/cmds/idmap2/tests/data/overlay/overlay-no-name-static.apk new file mode 100644 index 0000000000000000000000000000000000000000..18ee43dc57a4763a4fb8a6046d3b4812281fcc13 GIT binary patch literal 1643 zcmWIWW@cev-~d8~hWU&PNI)3KcFapD%Fj&kP0Y(oOD!(ZtH{miope@@#Zjcy|D~gJ z+d-X<$PJ<|J#}((U7Y^7y11P9(RTg72j^|xcTM#kUtMtdnKIp}^)A~#zL%BXWPf>IciD&81((loel&Y6wyHLE!b<^t z*X-5DRy_N^Fe-gtL+Ae2l5cm#@kgYF+$lD@$h>>jx#@0!$KQBA%-?uvQ{IKL6@Jwitx^4J z#e%*Q({}7Ee{^CcTe0~Glbd)>gqXVT;j)udEaTxh zIR9yd^{IFFS80CuKlAETw%@Bt&+|45mh*GD)zlo?>)*fn$DeKcZ^ry9oWFm{>Gd&n zk1ey+YuBBu+yBn3`p$~yO$YBuW;54cOFFxtfc@|0S@!RqaR+#_bF5$J{G=TiXC2H8 z3<2PH1V6MK>dZ3_}W#1||Xs z01E2B*g%>Gh$Vnn9f&zO^UG3;auO?b4UyQ!3_Lt=aoyrFB(4dF3j|CGj3q#q)B~9% z45xME@H@GNMxu4^7DWqATp657bva=R+R`;naPk0GGmwk1yG;^K?alt zu|aX*0i>Bg94JtMF@UrX5VHfrArBmS>EKXfU|<7>P!U)>9jqE;P7IL63g!U`pdAJ< zHjriqVsRjr17cMmW?{+9D=}o?<;}}4iOTLmENo!*Lus)8 zLH2{(5#Y@T5(c^lC;}`Ikjn~C$&L!Jl=CnHzzVSxDF_2j0R4+vzyx@+vVr88fUp)w I-vFmb00+iEB>(^b literal 0 HcmV?d00001 diff --git a/cmds/idmap2/tests/data/overlay/overlay-no-name.apk b/cmds/idmap2/tests/data/overlay/overlay-no-name.apk new file mode 100644 index 0000000000000000000000000000000000000000..7d23c09473ce53fd52685adc8336a17175f17a00 GIT binary patch literal 1567 zcmWIWW@cev-~d8~hWU&PNI)3KcFapD%Fj&kP0Y(oOD!(ZtH{miop{!Z*-)g_Un+aK z*uo@nF4qf7yJxQ5akW)DkmY*U+HE&}CZ-9LJT?BIV%OsT*m=eMC6ZP>9BOk^zTYeM zf9Jb~skTIA@y2_-CKs~in4YVCAhM?+`~#caL2-#mSIg@Z`Ip zMw7n&zg?=oqlZ1xitzBP#WZ&Hj?<;FBUs!*v?fmMp*ROM*-wcy4 z-TSQnUmZh$H#^70cQ>*vfPs93i2=w51w0r41Kwy+-j^rL3=AO5$H2@`lv>`F7hD3%+AU_W%0wNO` za)IK*6(~USMFx}x`4bce9zYrxlW?E{XE87c0om*fnZU3Cgv4J!@5Q_t`91yDlF$+s(UWp+CFK=FcNqlBrd`V(adTI$!xVWUq z5JDM4C=&)ICIN6d0681kos3K&3^hP8m^jFO2Oy>t2mlQLmLp&Qqy_#10f-N>2gV1v zNe0LVxd)iM5NR052Dz&NNW709J@msvv8x1o{`X Uj0x~&Wdo^T0>WA#-2+aM0Mp|h$p8QV literal 0 HcmV?d00001 diff --git a/cmds/idmap2/tests/data/overlay/overlay-static-1.apk b/cmds/idmap2/tests/data/overlay/overlay-static-1.apk index 9a0f487522c849e9de75fea8fe1ba621853057a0..642ab90d00ae70eb47c2151fd298ed190ab4fad9 100644 GIT binary patch delta 517 zcmdnb^O}b*z?+$cfq?@E85-s@PUKUq_w{0S6ljgN4m^G&RrVDGkd3Ke&c4Ike z@8aUpS${A^$S9Cw$B9FaE11IP9Wkz8{=4h4;p2{k_Uoa4UzLWI`ZBdvaj7isns$6i zWbZZ4Q~J%N8+gwhG_GLHe;`}apsPH$QR2%%ZjP&A?xkDr+zaK86|6q_Gwgar^$*j# zo9l0Hp7LMt?$LZJyC-#voWNlm#;=vd+jT}-04x$T|ZPa-UpZms;x@<5_&(9 z<^Hne9UW(7{+^QF#bdZ!`hNe~dzThhyEaFhH+*}>r2e!9`>!mw*wQxz)3P(THFJMS z-?(bNaN0&u$<0hOGv4XQ^lhYd!iRS$tAIqM`#;3CW+n-vx^Wxs1 zqs5OC4(*LS*wXL6JKyL*m)-ui1&UMmKluDS=;zc^`8Mfqd(N90zq#&Pc)+(xPvY*} z?PeeH&tBs(GM3oqeD#mvZ2bUlc8(oW-Bz|RGBDIIGcZ7+i2($F(X`(vvFHg<6omO0 zm>G&vi}Op1l2eQI5{rtH85lMnXZ*y>15^k%V)9W|Q)ZyRTfZn>O?cB9F25c5_wJNG-#7Cn3sfdD_OHp7q@_iee-K2l4&ANRH z+y8(^Z#nLE-s1Z6|IjO@_~qB$ROHECxwBUEN=@zUxdjKWdjG3d{l7N;Pv|G}d7Fz5 zSDQ|I9{Vz?jPK9hRsS5H?mJyQ)BfH==>Ttbj)kwbvPCg6FsLvyFhIhd0R(_yzuzda z=m|4}I0KMi;A3E9C`v8PFD*(=E!ImcDo)<~neh`d4^SQ4gvlRSP2~_8q58naL5bOu MUDy=a*06%O0D)G^x&QzG diff --git a/cmds/idmap2/tests/data/overlay/overlay-static-2.apk b/cmds/idmap2/tests/data/overlay/overlay-static-2.apk index 3fc31c7d11b0a5504efc64cba6454cbbe4751879..2ec56020c4aacac2eb892ff50837c05b212f0250 100644 GIT binary patch delta 518 zcmdnb^O}b*z?+$cfq?@E85-s@PUKUqKdHb0yj-+REH^1LTUn^7 ztD|FrSnieF%h5uet*ysDvV_e$VqC#oXFT^+scTZ+KFjodpU+yRr{ygO=x%N zD!1S3t~-Yrit^8S`?4?A_qliF6~W(ZA7s~TS!Q-iajRL#^X`k=0`D*C3H5%Ny>GKs z&HQ<#;RWbJrNETPCw9uobu4tLU%JZy~ z_jX@n`?u!hEXP-TF2~YM>+hTu5AbH^VEG*Xx{Z;6p@x}(0TNLRAOMUgU7cTzPk^Ez z%*VjUP?TDnUs{x$TCA5?RGiGP`2^!fW*(qAxCxVwvYIjj1t$Mxm0~ zzNr0Fwt#Kj0f{}0u>MU*bDrHJ+U;l;4=tWE389(S2VzkNx6opVSV$e-EXt+Na!{94xZ#cS!N}^M+en zlhdYFzg!UWYH^oU(VJJ>-dxX|vgPUSX>qPo05I@% zb$&HIVU}QEcmkB-1Bw-;7U!21C8rkaB^DJYZ~nsgk(mdm4sOEakF2J0aE%CkU<1L# OoXIY1ifn6GK^y?tVAI|J diff --git a/cmds/idmap2/tests/data/overlay/overlay.apk b/cmds/idmap2/tests/data/overlay/overlay.apk index b4cd7cfc324891e9ec0d20eea896dfc1ee923b37..5842da4f432e285c5f8612a87f20d589d116ff55 100644 GIT binary patch delta 471 zcmbQvvzv!6z?+$cfq?@E85-s@PUKUmpLEviu!BhJd6TurwmG?qbGeqhUUajAd%IJ( z)>rnzhfbMS#cnTA2`zYTyyKH+4V(O7^Nab*79SHi$f^GQ+|K9oW=acbgxF5#nN?+e zX;EF6`tmHp@w&@yfTfgyNm3uGe^XF}DiAweQ;4;bOa=T}|n73}->7|ud z3~M$2G-%|m>@PbMxx1^vXiM!Cu0dgp3=BNX3=EKfX8-|Uz-Jp5TzLW% peZsuCn~{x$7bt{KJb50gi5!X|1_nN`P8czL@&{H$wiT=(J^)2o$4USI delta 425 zcmdnZGo6Poz?+$cfq?@E88{RfCi1D&Pdx8+*g@df{56LCNCb?U{3bKD&LlGjzfEX(=XG+9y^; z-E!5v$Nv0*=$^*%53Ktf=kIea;Mx}Q%5SHfsoE};eb*z1$DZUSb17WDo@ZMBp?U4Y+Y4O(ZJV|}XKuxT^uPZDb9Q&0ea(2~;Ue*f?^cn! z*Q|bB9J{{0=l;r<<$Lz6d>Ov&;cu<{zqPY#w|(q8T6ufQj0_B0 zm>3u!fyw{^z(C!+lu>|%7sx;;nS6-VL=GsDZCr5W2{Qu&2=jr}!-(R^B5aCmEvz6u E0R6kW0RR91 diff --git a/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml b/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml index 8af9064ba64fe..5dacebded5297 100644 --- a/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml +++ b/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml @@ -14,8 +14,9 @@ limitations under the License. --> + xmlns:android="http://schemas.android.com/apk/res/android" + package="test.overlay.system"> + android:targetPackage="test.target" + android:targetName="TestResources"/> diff --git a/cmds/idmap2/tests/data/system-overlay/system-overlay.apk b/cmds/idmap2/tests/data/system-overlay/system-overlay.apk index 90f30eb68c1576a4f13b08a9069c9025d86b4f99..a0fba4378b57b6181990874a1674963451954c76 100644 GIT binary patch delta 445 zcmV;u0Yd(R3a1K?GJlfIO2a@Dh0mB)Yg?hB3xy)Ob&+hugxB!Mbg2_&PY-i@@N>1gHRHLwjXz%zIO zuiy==vu_LRfphTWd`7xbs#{$XwTRog<89Yc^+)!Qc;NU&RDTKaP(AfwPSj!78BwYX zE>VnX^&hHT-W{0u+uP_!wyslF8K)k*Inh14+AfynP{-^`;d{)|rn+cHoVBBfCqvss zJwTZ$Ea*dDSp+|%rihGnj(+)8oI}j&#@Ay{PxRor=#v{eW>~nnC6p6=SWt(sW0$ej zNwu6Zf7{Zd;eVSmZ^)Q~k}+x7m<-4?9Nz#Rj9FKKGy{K`d@2h)`UrlAt**Wk%6up8%Z(lu_KYIQI zP)i30&$`cGT>$_97y|$RP)h>@000000001hp8~0CW%#~kA`H_)4P$jRoZ36KLi)x6)eFU_yk{| zL)|gxgB{IvuUtZgDZ59{ znETT+z4$&SfCBWzx6s>yT`g;^T+*u08mQ@2+|WCIXVFV0K@{5oB+00000KytSS diff --git a/cmds/idmap2/tests/data/target/build b/cmds/idmap2/tests/data/target/build index 8569c4ff0a6b3..137ddb5ecaa1a 100644 --- a/cmds/idmap2/tests/data/target/build +++ b/cmds/idmap2/tests/data/target/build @@ -15,3 +15,7 @@ aapt2 compile --dir res -o compiled.flata aapt2 link --manifest AndroidManifest.xml -A assets -o target.apk compiled.flata rm compiled.flata + +aapt2 compile res/values/values.xml -o . +aapt2 link --manifest AndroidManifest.xml -A assets -o target_no_overlayable.apk values_values.arsc.flat +rm values_values.arsc.flat \ No newline at end of file diff --git a/cmds/idmap2/tests/data/target/target-no-overlayable.apk b/cmds/idmap2/tests/data/target/target-no-overlayable.apk new file mode 100644 index 0000000000000000000000000000000000000000..8676cbb9dc3f84064ba9ff0fb1a35e4fc47b62e7 GIT binary patch literal 2075 zcmd^=Sx8h-7{||SspT@I^`KD`DTLve+C$Ldv`f=6Xi-UI*O{A6&CIoX@0e533@s8u zwiz`Kp%K=Dv_cTQv=A*siy(q+6hV&>(FPIr|IVD-j21mqZ=K8Ue#=?zS-$%nkK1Bp zEFBMvb(&a8$%Q^Q;I@{Cf1PuC2Z2S4}=V<49%2w>Q20#eMgx7S%j2`uOp3Wa`9|maAO_`BPS%J6b&U zNp5$%dDFXUcTvmP%uD_8hqYVIRGzN&xLw3GTmR@m@BGwbY3O#(qe4(`BoskuNHpYl-W@f6aDPh$sYfeekybPX9UPoJF zV&mz>?7TB~uyuwGX#r_q6vzRSKslHPs(~NqAPU;RQ4j|w0E)>ZfqLL&IXNLkuTz?3 zH6TT#`hd)`vzwHF-y5lGQWam=tFx>u!x64WMbg$Hnl1-fUY@8=*mccv$fu|*Jzba7 z23apDORD8bwIZob$4pv41Z?9oG&@Xp5iK--oyknY+X*D5vIf|+w*RF#C?HT8g(RKg zqYBbYhA4%G0yzexAqql#_h`pdct-GjRJp%_w>IKzG`H}=H#QhLWNM7jUs?o8z#Om~ ztOsGR1MCJAYlnalZ&s^6q?h4Te;02yo1!<$>OYG+t5wt0GR8%DLR2KgPjO~8+gTpw zOIvGfugScUHKzF1KzD(^Ey#PkK-%eB^lcAG@Z&${E&l99^X|aF#&{hV#`R}I4e3R5 zbAV~U1!&G2Kof|8gP;ps0N24|@DjWOv}Rf>q(w+RKeB0_R8P5#Y#|wbdu|KKkS@6m z!P}1zw(#>9rT)Ut+mKDMOXFvV_M{Udg)RI%hf;gtM;1M#8KEXk(4JoE;5^r~hx@;c>qHV#OdChJ;hKvCsjiN8q;2c3G0zLZP{Hyu6&l@86X zJEWkjJ4brlCfYX43tzyUl6u?F|2ee$;!ZUN;0=Gelv2CDhcWbu8s2yKa+1A2;4FT< TIFH*#=Y&JIup5vI=# LoadedPackage::Load(const Chunk& chunk, overlayable_info.actor = actor; overlayable_info.policy_flags = policy_header->policy_flags; loaded_package->overlayable_infos_.push_back(std::make_pair(overlayable_info, ids)); + loaded_package->defines_overlayable_ = true; break; } diff --git a/libs/androidfw/include/androidfw/LoadedArsc.h b/libs/androidfw/include/androidfw/LoadedArsc.h index be62f30617bf2..b5f4006dbb00a 100644 --- a/libs/androidfw/include/androidfw/LoadedArsc.h +++ b/libs/androidfw/include/androidfw/LoadedArsc.h @@ -223,7 +223,7 @@ class LoadedPackage { } } - // Retrieve the overlayable properties of the specified resource. If the resource is not + // Retrieves the overlayable properties of the specified resource. If the resource is not // overlayable, this will return a null pointer. const OverlayableInfo* GetOverlayableInfo(uint32_t resid) const { for (const std::pair>& overlayable_info_ids @@ -235,6 +235,13 @@ class LoadedPackage { return nullptr; } + // Retrieves whether or not the package defines overlayable resources. + // TODO(123905379): Remove this when the enforcement of overlayable is turned on for all APK and + // not just those that defined overlayable resources. + bool DefinesOverlayable() const { + return defines_overlayable_; + } + private: DISALLOW_COPY_AND_ASSIGN(LoadedPackage); @@ -248,6 +255,7 @@ class LoadedPackage { bool dynamic_ = false; bool system_ = false; bool overlay_ = false; + bool defines_overlayable_ = false; ByteBucketArray type_specs_; ByteBucketArray resource_ids_;