From 30dc2e01714a50e3816efa3bd347d1bf783fa0a5 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Wed, 2 Dec 2020 11:43:18 -0800 Subject: [PATCH] Accept --overlay-name flag in idmap2 To support allowing for multiple tags in one package, idmap2 must be able to generate an idmap for an individual tag. `idmap2 create` now accepts a --overlay-name flag that specifies which tag to use to generate the idmap. The value of --overlay-name should be set to the value of the android:name attribute on the tag to use. If the flag is not present, idmap2 will look for an tag with no value for android:name. Bug: 162841629 Test: libandroidfw_tests Test: libidmap2_tests Change-Id: I02316d0b88773f02c04a5d462be9825016fa496d --- cmds/idmap2/idmap2/CommandUtils.cpp | 8 +- cmds/idmap2/idmap2/CommandUtils.h | 8 +- cmds/idmap2/idmap2/Create.cpp | 9 +- cmds/idmap2/idmap2/CreateMultiple.cpp | 7 +- cmds/idmap2/idmap2/Lookup.cpp | 6 +- cmds/idmap2/idmap2d/Idmap2Service.cpp | 6 +- cmds/idmap2/include/idmap2/Idmap.h | 32 ++- cmds/idmap2/include/idmap2/ResourceUtils.h | 13 +- cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp | 1 + cmds/idmap2/libidmap2/Idmap.cpp | 24 +- cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp | 4 + cmds/idmap2/libidmap2/RawPrintVisitor.cpp | 1 + cmds/idmap2/libidmap2/ResourceUtils.cpp | 82 +++---- .../idmap2/tests/BinaryStreamVisitorTests.cpp | 2 +- cmds/idmap2/tests/Idmap2BinaryTests.cpp | 35 ++- cmds/idmap2/tests/IdmapTests.cpp | 232 +++++++++++------- cmds/idmap2/tests/PrettyPrintVisitorTests.cpp | 16 +- cmds/idmap2/tests/R.h | 66 ++--- cmds/idmap2/tests/RawPrintVisitorTests.cpp | 51 ++-- cmds/idmap2/tests/ResourceMappingTests.cpp | 224 +++++++---------- cmds/idmap2/tests/TestConstants.h | 7 +- cmds/idmap2/tests/TestHelpers.h | 73 +++--- .../tests/data/overlay/AndroidManifest.xml | 39 ++- .../AndroidManifestLegacy.xml} | 12 +- .../data/overlay/AndroidManifestNoName.xml | 21 -- .../overlay/AndroidManifestNoNameStatic.xml | 24 -- .../data/overlay/AndroidManifestStatic1.xml | 24 -- .../data/overlay/AndroidManifestStatic2.xml | 24 -- cmds/idmap2/tests/data/overlay/build | 37 +-- .../tests/data/overlay/overlay-legacy.apk | Bin 0 -> 4708 bytes .../data/overlay/overlay-no-name-static.apk | Bin 3485 -> 0 bytes .../tests/data/overlay/overlay-no-name.apk | Bin 3393 -> 0 bytes .../tests/data/overlay/overlay-shared.apk | Bin 3757 -> 5216 bytes .../tests/data/overlay/overlay-static-1.apk | Bin 3477 -> 0 bytes .../tests/data/overlay/overlay-static-2.apk | Bin 3477 -> 0 bytes cmds/idmap2/tests/data/overlay/overlay.apk | Bin 3489 -> 4952 bytes .../tests/data/overlay/res/values/values.xml | 21 ++ .../overlay/res/xml/overlays_policies.xml | 33 +++ .../signature-overlay/AndroidManifest.xml | 25 -- .../idmap2/tests/data/signature-overlay/build | 26 -- .../signature-overlay/res/values/values.xml | 20 -- .../signature-overlay/signature-overlay.apk | Bin 1299 -> 0 bytes .../AndroidManifest.xml | 23 -- .../tests/data/system-overlay-invalid/build | 26 -- .../res/values/values.xml | 37 --- .../system-overlay-invalid.apk | Bin 1907 -> 0 bytes cmds/idmap2/tests/data/system-overlay/build | 26 -- .../data/system-overlay/res/values/values.xml | 22 -- .../data/system-overlay/system-overlay.apk | Bin 1387 -> 0 bytes libs/androidfw/Idmap.cpp | 3 +- .../include/androidfw/ResourceTypes.h | 2 +- libs/androidfw/tests/data/app/app.apk | Bin 1402 -> 9008 bytes .../tests/data/overlay/overlay.idmap | Bin 636 -> 640 bytes 53 files changed, 566 insertions(+), 786 deletions(-) rename cmds/idmap2/tests/data/{system-overlay/AndroidManifest.xml => overlay/AndroidManifestLegacy.xml} (71%) delete mode 100644 cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml delete mode 100644 cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml delete mode 100644 cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml delete mode 100644 cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml create mode 100644 cmds/idmap2/tests/data/overlay/overlay-legacy.apk delete mode 100644 cmds/idmap2/tests/data/overlay/overlay-no-name-static.apk delete mode 100644 cmds/idmap2/tests/data/overlay/overlay-no-name.apk delete mode 100644 cmds/idmap2/tests/data/overlay/overlay-static-1.apk delete mode 100644 cmds/idmap2/tests/data/overlay/overlay-static-2.apk create mode 100644 cmds/idmap2/tests/data/overlay/res/xml/overlays_policies.xml delete mode 100644 cmds/idmap2/tests/data/signature-overlay/AndroidManifest.xml delete mode 100755 cmds/idmap2/tests/data/signature-overlay/build delete mode 100644 cmds/idmap2/tests/data/signature-overlay/res/values/values.xml delete mode 100644 cmds/idmap2/tests/data/signature-overlay/signature-overlay.apk delete mode 100644 cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml delete mode 100755 cmds/idmap2/tests/data/system-overlay-invalid/build delete mode 100644 cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml delete mode 100644 cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk delete mode 100755 cmds/idmap2/tests/data/system-overlay/build delete mode 100644 cmds/idmap2/tests/data/system-overlay/res/values/values.xml delete mode 100644 cmds/idmap2/tests/data/system-overlay/system-overlay.apk diff --git a/cmds/idmap2/idmap2/CommandUtils.cpp b/cmds/idmap2/idmap2/CommandUtils.cpp index 45f37962331b3..09867f3a9c202 100644 --- a/cmds/idmap2/idmap2/CommandUtils.cpp +++ b/cmds/idmap2/idmap2/CommandUtils.cpp @@ -29,8 +29,8 @@ using android::idmap2::Result; using android::idmap2::Unit; Result Verify(const std::string& idmap_path, const std::string& target_path, - const std::string& overlay_path, PolicyBitmask fulfilled_policies, - bool enforce_overlayable) { + const std::string& overlay_path, const std::string& overlay_name, + PolicyBitmask fulfilled_policies, bool enforce_overlayable) { SYSTRACE << "Verify " << idmap_path; std::ifstream fin(idmap_path); const std::unique_ptr header = IdmapHeader::FromBinaryStream(fin); @@ -39,8 +39,8 @@ Result Verify(const std::string& idmap_path, const std::string& target_pat return Error("failed to parse idmap header"); } - const auto header_ok = - header->IsUpToDate(target_path, overlay_path, fulfilled_policies, enforce_overlayable); + const auto header_ok = header->IsUpToDate(target_path, overlay_path, overlay_name, + fulfilled_policies, enforce_overlayable); if (!header_ok) { return Error(header_ok.GetError(), "idmap not up to date"); } diff --git a/cmds/idmap2/idmap2/CommandUtils.h b/cmds/idmap2/idmap2/CommandUtils.h index e717e046d15d5..e06896784d6a3 100644 --- a/cmds/idmap2/idmap2/CommandUtils.h +++ b/cmds/idmap2/idmap2/CommandUtils.h @@ -20,10 +20,8 @@ #include "idmap2/PolicyUtils.h" #include "idmap2/Result.h" -android::idmap2::Result Verify(const std::string& idmap_path, - const std::string& target_path, - const std::string& overlay_path, - PolicyBitmask fulfilled_policies, - bool enforce_overlayable); +android::idmap2::Result Verify( + const std::string& idmap_path, const std::string& target_path, const std::string& overlay_path, + const std::string& overlay_name, PolicyBitmask fulfilled_policies, bool enforce_overlayable); #endif // IDMAP2_IDMAP2_COMMAND_UTILS_H_ diff --git a/cmds/idmap2/idmap2/Create.cpp b/cmds/idmap2/idmap2/Create.cpp index 648b78e24c23f..c93c717a15d29 100644 --- a/cmds/idmap2/idmap2/Create.cpp +++ b/cmds/idmap2/idmap2/Create.cpp @@ -50,6 +50,7 @@ Result Create(const std::vector& args) { std::string target_apk_path; std::string overlay_apk_path; std::string idmap_path; + std::string overlay_name; std::vector policies; bool ignore_overlayable = false; @@ -62,9 +63,11 @@ Result Create(const std::vector& args) { "input: path to apk which contains the new resource values", &overlay_apk_path) .MandatoryOption("--idmap-path", "output: path to where to write idmap file", &idmap_path) + .OptionalOption("--overlay-name", "input: the value of android:name of the overlay", + &overlay_name) .OptionalOption("--policy", "input: an overlayable policy this overlay fulfills " - "(if none or supplied, the overlay policy will default to \"public\")", + "(if none are supplied, the overlay policy will default to \"public\")", &policies) .OptionalFlag("--ignore-overlayable", "disables overlayable and policy checks", &ignore_overlayable); @@ -100,8 +103,8 @@ Result Create(const std::vector& args) { return Error("failed to load apk %s", overlay_apk_path.c_str()); } - const auto idmap = - Idmap::FromApkAssets(*target_apk, *overlay_apk, fulfilled_policies, !ignore_overlayable); + const auto idmap = Idmap::FromApkAssets(*target_apk, *overlay_apk, overlay_name, + fulfilled_policies, !ignore_overlayable); if (!idmap) { return Error(idmap.GetError(), "failed to create idmap"); } diff --git a/cmds/idmap2/idmap2/CreateMultiple.cpp b/cmds/idmap2/idmap2/CreateMultiple.cpp index 19622c4ef65a7..5db391caac309 100644 --- a/cmds/idmap2/idmap2/CreateMultiple.cpp +++ b/cmds/idmap2/idmap2/CreateMultiple.cpp @@ -105,7 +105,8 @@ Result CreateMultiple(const std::vector& args) { continue; } - if (!Verify(idmap_path, target_apk_path, overlay_apk_path, fulfilled_policies, + // TODO(b/175014391): Support multiple overlay tags in OverlayConfig + if (!Verify(idmap_path, target_apk_path, overlay_apk_path, "", fulfilled_policies, !ignore_overlayable)) { const std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); if (!overlay_apk) { @@ -113,8 +114,8 @@ Result CreateMultiple(const std::vector& args) { continue; } - const auto idmap = - Idmap::FromApkAssets(*target_apk, *overlay_apk, fulfilled_policies, !ignore_overlayable); + const auto idmap = Idmap::FromApkAssets(*target_apk, *overlay_apk, "", fulfilled_policies, + !ignore_overlayable); if (!idmap) { LOG(WARNING) << "failed to create idmap"; continue; diff --git a/cmds/idmap2/idmap2/Lookup.cpp b/cmds/idmap2/idmap2/Lookup.cpp index 64e49307c0df5..43a1951a5ba96 100644 --- a/cmds/idmap2/idmap2/Lookup.cpp +++ b/cmds/idmap2/idmap2/Lookup.cpp @@ -195,12 +195,12 @@ Result Lookup(const std::vector& args) { } apk_assets.push_back(std::move(target_apk)); - auto manifest_info = - ExtractOverlayManifestInfo(idmap_header->GetOverlayPath(), true /* assert_overlay */); + auto manifest_info = ExtractOverlayManifestInfo(idmap_header->GetOverlayPath(), + idmap_header->GetOverlayName()); if (!manifest_info) { return manifest_info.GetError(); } - target_package_name = (*manifest_info).target_package; + target_package_name = manifest_info->target_package; } else if (target_path != idmap_header->GetTargetPath()) { return Error("different target APKs (expected target APK %s but %s has target APK %s)", target_path.c_str(), idmap_path.c_str(), idmap_header->GetTargetPath().c_str()); diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp index 8a7272c073b94..93537d32299b7 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.cpp +++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp @@ -155,8 +155,9 @@ Status Idmap2Service::verifyIdmap(const std::string& target_apk_path, return overlay_crc_status; } + // TODO(162841629): Support passing overlay name to idmap2d verify auto up_to_date = - header->IsUpToDate(target_apk_path overlay_apk_path, target_crc, overlay_crc, + header->IsUpToDate(target_apk_path, overlay_apk_path, "", target_crc, overlay_crc, ConvertAidlArgToPolicyBitmask(fulfilled_policies), enforce_overlayable); *_aidl_return = static_cast(up_to_date); @@ -190,8 +191,9 @@ Status Idmap2Service::createIdmap(const std::string& target_apk_path, return error("failed to load apk " + overlay_apk_path); } + // TODO(162841629): Support passing overlay name to idmap2d create const auto idmap = - Idmap::FromApkAssets(*target_apk, *overlay_apk, policy_bitmask, enforce_overlayable); + Idmap::FromApkAssets(*target_apk, *overlay_apk, "", policy_bitmask, enforce_overlayable); if (!idmap) { return error(idmap.GetErrorMessage()); } diff --git a/cmds/idmap2/include/idmap2/Idmap.h b/cmds/idmap2/include/idmap2/Idmap.h index 3163e40a7bffa..1b815c1197cad 100644 --- a/cmds/idmap2/include/idmap2/Idmap.h +++ b/cmds/idmap2/include/idmap2/Idmap.h @@ -19,7 +19,8 @@ * * idmap := header data* * header := magic version target_crc overlay_crc fulfilled_policies - * enforce_overlayable target_path overlay_path debug_info + * enforce_overlayable target_path overlay_path overlay_name + * debug_info * data := data_header target_entry* target_inline_entry* overlay_entry* * string_pool * data_header := target_package_id overlay_package_id padding(2) target_entry_count @@ -37,6 +38,7 @@ * overlay_entry_count := * overlay_id := * overlay_package_id := + * overlay_name := string * overlay_path := string * padding(n) := [n] * Res_value::size := @@ -77,9 +79,6 @@ namespace android::idmap2 { class Idmap; class Visitor; -static constexpr const ResourceId kPadding = 0xffffffffu; -static constexpr const EntryId kNoEntry = 0xffffu; - // magic number: all idmap files start with this static constexpr const uint32_t kIdmapMagic = android::kIdmapMagic; @@ -125,6 +124,10 @@ class IdmapHeader { return overlay_path_; } + const std::string& GetOverlayName() const { + return overlay_name_; + } + const std::string& GetDebugInfo() const { return debug_info_; } @@ -133,16 +136,18 @@ class IdmapHeader { // field *must* be incremented. Because of this, we know that if the idmap // header is up-to-date the entire file is up-to-date. Result IsUpToDate(const std::string& target_path, const std::string& overlay_path, - PolicyBitmask fulfilled_policies, bool enforce_overlayable) const; + const std::string& overlay_name, PolicyBitmask fulfilled_policies, + bool enforce_overlayable) const; + Result IsUpToDate(const std::string& target_path, const std::string& overlay_path, - uint32_t target_crc, uint32_t overlay_crc, - PolicyBitmask fulfilled_policies, bool enforce_overlayable) const; + const std::string& overlay_name, uint32_t target_crc, + uint32_t overlay_crc, PolicyBitmask fulfilled_policies, + bool enforce_overlayable) const; void accept(Visitor* v) const; private: - IdmapHeader() { - } + IdmapHeader() = default; uint32_t magic_; uint32_t version_; @@ -152,6 +157,7 @@ class IdmapHeader { bool enforce_overlayable_; std::string target_path_; std::string overlay_path_; + std::string overlay_name_; std::string debug_info_; friend Idmap; @@ -246,8 +252,7 @@ class IdmapData { void accept(Visitor* v) const; private: - IdmapData() { - } + IdmapData() = default; std::unique_ptr header_; std::vector target_entries_; @@ -272,14 +277,15 @@ class Idmap { // the target and overlay package names static Result> FromApkAssets(const ApkAssets& target_apk_assets, const ApkAssets& overlay_apk_assets, + const std::string& overlay_name, const PolicyBitmask& fulfilled_policies, bool enforce_overlayable); - inline const std::unique_ptr& GetHeader() const { + const std::unique_ptr& GetHeader() const { return header_; } - inline const std::vector>& GetData() const { + const std::vector>& GetData() const { return data_; } diff --git a/cmds/idmap2/include/idmap2/ResourceUtils.h b/cmds/idmap2/include/idmap2/ResourceUtils.h index c643b0e8800cc..cd14d3e7254ca 100644 --- a/cmds/idmap2/include/idmap2/ResourceUtils.h +++ b/cmds/idmap2/include/idmap2/ResourceUtils.h @@ -44,17 +44,14 @@ bool IsReference(uint8_t data_type); StringPiece DataTypeToString(uint8_t data_type); struct OverlayManifestInfo { - std::string target_package; // NOLINT(misc-non-private-member-variables-in-classes) - std::string target_name; // NOLINT(misc-non-private-member-variables-in-classes) - std::string requiredSystemPropertyName; // NOLINT(misc-non-private-member-variables-in-classes) - std::string requiredSystemPropertyValue; // NOLINT(misc-non-private-member-variables-in-classes) - uint32_t resource_mapping; // NOLINT(misc-non-private-member-variables-in-classes) - bool is_static; // NOLINT(misc-non-private-member-variables-in-classes) - int priority = -1; // NOLINT(misc-non-private-member-variables-in-classes) + std::string name; // NOLINT(misc-non-private-member-variables-in-classes) + std::string target_package; // NOLINT(misc-non-private-member-variables-in-classes) + std::string target_name; // NOLINT(misc-non-private-member-variables-in-classes) + uint32_t resource_mapping; // NOLINT(misc-non-private-member-variables-in-classes) }; Result ExtractOverlayManifestInfo(const std::string& path, - bool assert_overlay = true); + const std::string& name); Result ResToTypeEntryName(const AssetManager2& am, ResourceId resid); diff --git a/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp b/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp index 5db09baca5d5a..c16310792d128 100644 --- a/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp +++ b/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp @@ -59,6 +59,7 @@ void BinaryStreamVisitor::visit(const IdmapHeader& header) { Write32(static_cast(header.GetEnforceOverlayable())); WriteString(header.GetTargetPath()); WriteString(header.GetOverlayPath()); + WriteString(header.GetOverlayName()); WriteString(header.GetDebugInfo()); } diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp index 4745cc6cdc331..5af84b0c6e4e7 100644 --- a/cmds/idmap2/libidmap2/Idmap.cpp +++ b/cmds/idmap2/libidmap2/Idmap.cpp @@ -109,6 +109,7 @@ std::unique_ptr IdmapHeader::FromBinaryStream(std::istream& s !Read32(stream, &idmap_header->fulfilled_policies_) || !Read32(stream, &enforce_overlayable) || !ReadString(stream, &idmap_header->target_path_) || !ReadString(stream, &idmap_header->overlay_path_) || + !ReadString(stream, &idmap_header->overlay_name_) || !ReadString(stream, &idmap_header->debug_info_)) { return nullptr; } @@ -119,6 +120,7 @@ std::unique_ptr IdmapHeader::FromBinaryStream(std::istream& s Result IdmapHeader::IsUpToDate(const std::string& target_path, const std::string& overlay_path, + const std::string& overlay_name, PolicyBitmask fulfilled_policies, bool enforce_overlayable) const { const std::unique_ptr target_zip = ZipFile::Open(target_path); @@ -141,12 +143,13 @@ Result IdmapHeader::IsUpToDate(const std::string& target_path, return Error("failed to get overlay crc"); } - return IsUpToDate(target_path, overlay_path, *target_crc, *overlay_crc, fulfilled_policies, - enforce_overlayable); + return IsUpToDate(target_path, overlay_path, overlay_name, *target_crc, *overlay_crc, + fulfilled_policies, enforce_overlayable); } Result IdmapHeader::IsUpToDate(const std::string& target_path, - const std::string& overlay_path, uint32_t target_crc, + const std::string& overlay_path, + const std::string& overlay_name, uint32_t target_crc, uint32_t overlay_crc, PolicyBitmask fulfilled_policies, bool enforce_overlayable) const { if (magic_ != kIdmapMagic) { @@ -187,6 +190,11 @@ Result IdmapHeader::IsUpToDate(const std::string& target_path, overlay_path_.c_str()); } + if (overlay_name != overlay_name_) { + return Error("bad overlay name: idmap version %s, file system version %s", overlay_name.c_str(), + overlay_name_.c_str()); + } + return Unit{}; } @@ -317,6 +325,7 @@ Result> IdmapData::FromResourceMapping( Result> Idmap::FromApkAssets(const ApkAssets& target_apk_assets, const ApkAssets& overlay_apk_assets, + const std::string& overlay_name, const PolicyBitmask& fulfilled_policies, bool enforce_overlayable) { SYSTRACE << "Idmap::FromApkAssets"; @@ -352,15 +361,16 @@ Result> Idmap::FromApkAssets(const ApkAssets& targe header->enforce_overlayable_ = enforce_overlayable; header->target_path_ = target_apk_path; header->overlay_path_ = overlay_apk_path; + header->overlay_name_ = overlay_name; - auto overlay_info = utils::ExtractOverlayManifestInfo(overlay_apk_path); - if (!overlay_info) { - return overlay_info.GetError(); + auto info = utils::ExtractOverlayManifestInfo(overlay_apk_path, overlay_name); + if (!info) { + return info.GetError(); } LogInfo log_info; auto resource_mapping = - ResourceMapping::FromApkAssets(target_apk_assets, overlay_apk_assets, *overlay_info, + ResourceMapping::FromApkAssets(target_apk_assets, overlay_apk_assets, *info, fulfilled_policies, enforce_overlayable, log_info); if (!resource_mapping) { return resource_mapping.GetError(); diff --git a/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp b/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp index f56d3d21e25b6..7e090a983f959 100644 --- a/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp @@ -39,6 +39,10 @@ void PrettyPrintVisitor::visit(const IdmapHeader& header) { << TAB "target apk path : " << header.GetTargetPath() << std::endl << TAB "overlay apk path : " << header.GetOverlayPath() << std::endl; + if (!header.GetOverlayName().empty()) { + stream_ << "Overlay name: " << header.GetOverlayName() << std::endl; + } + const std::string& debug = header.GetDebugInfo(); if (!debug.empty()) { std::istringstream debug_stream(debug); diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp index d7f073944542e..b517aa3a0c01b 100644 --- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp @@ -45,6 +45,7 @@ void RawPrintVisitor::visit(const IdmapHeader& header) { print(static_cast(header.GetEnforceOverlayable()), "enforce overlayable"); print(header.GetTargetPath(), true /* print_value */, "target path"); print(header.GetOverlayPath(), true /* print_value */, "overlay path"); + print(header.GetOverlayName(), true /* print_value */, "overlay name"); print(header.GetDebugInfo(), false /* print_value */, "debug info"); auto target_apk_ = ApkAssets::Load(header.GetTargetPath()); diff --git a/cmds/idmap2/libidmap2/ResourceUtils.cpp b/cmds/idmap2/libidmap2/ResourceUtils.cpp index e817140238ae5..52837418e7759 100644 --- a/cmds/idmap2/libidmap2/ResourceUtils.cpp +++ b/cmds/idmap2/libidmap2/ResourceUtils.cpp @@ -92,7 +92,7 @@ Result ResToTypeEntryName(const AssetManager2& am, uint32_t resid) } Result ExtractOverlayManifestInfo(const std::string& path, - bool assert_overlay) { + const std::string& name) { std::unique_ptr zip = ZipFile::Open(path); if (!zip) { return Error("failed to open %s as a zip file", path.c_str()); @@ -113,65 +113,49 @@ Result ExtractOverlayManifestInfo(const std::string& path, return Error("root element tag is not in AndroidManifest.xml of %s", path.c_str()); } - auto overlay_it = std::find_if(manifest_it.begin(), manifest_it.end(), [](const auto& it) { - return it.event() == XmlParser::Event::START_TAG && it.name() == "overlay"; - }); - - OverlayManifestInfo info{}; - if (overlay_it == manifest_it.end()) { - if (!assert_overlay) { - return info; + for (auto&& it : manifest_it) { + if (it.event() != XmlParser::Event::START_TAG || it.name() != "overlay") { + continue; } - return Error(" missing from AndroidManifest.xml of %s", path.c_str()); - } - if (auto result_str = overlay_it->GetAttributeStringValue("targetPackage")) { - info.target_package = *result_str; - } else { - return Error("android:targetPackage missing from of %s: %s", path.c_str(), - result_str.GetErrorMessage().c_str()); - } + OverlayManifestInfo info{}; + if (auto result_str = it.GetAttributeStringValue("name")) { + if (*result_str != name) { + // A value for android:name was found, but either a the name does not match the requested + // name, or an tag with no name was requested. + continue; + } + info.name = *result_str; + } else if (!name.empty()) { + // This tag does not have a value for android:name, but an tag with a specific name + // has been requested. + continue; + } - if (auto result_str = overlay_it->GetAttributeStringValue("targetName")) { - info.target_name = *result_str; - } - - if (auto result_value = overlay_it->GetAttributeValue("resourcesMap")) { - if (IsReference((*result_value).dataType)) { - info.resource_mapping = (*result_value).data; + if (auto result_str = it.GetAttributeStringValue("targetPackage")) { + info.target_package = *result_str; } else { - return Error("android:resourcesMap is not a reference in AndroidManifest.xml of %s", - path.c_str()); + return Error("android:targetPackage missing from of %s: %s", path.c_str(), + result_str.GetErrorMessage().c_str()); } - } - if (auto result_value = overlay_it->GetAttributeValue("isStatic")) { - if ((*result_value).dataType >= Res_value::TYPE_FIRST_INT && - (*result_value).dataType <= Res_value::TYPE_LAST_INT) { - info.is_static = (*result_value).data != 0U; - } else { - return Error("android:isStatic is not a boolean in AndroidManifest.xml of %s", path.c_str()); + if (auto result_str = it.GetAttributeStringValue("targetName")) { + info.target_name = *result_str; } - } - if (auto result_value = overlay_it->GetAttributeValue("priority")) { - if ((*result_value).dataType >= Res_value::TYPE_FIRST_INT && - (*result_value).dataType <= Res_value::TYPE_LAST_INT) { - info.priority = (*result_value).data; - } else { - return Error("android:priority is not an integer in AndroidManifest.xml of %s", path.c_str()); + if (auto result_value = it.GetAttributeValue("resourcesMap")) { + if (IsReference((*result_value).dataType)) { + info.resource_mapping = (*result_value).data; + } else { + return Error("android:resourcesMap is not a reference in AndroidManifest.xml of %s", + path.c_str()); + } } + return info; } - if (auto result_str = overlay_it->GetAttributeStringValue("requiredSystemPropertyName")) { - info.requiredSystemPropertyName = *result_str; - } - - if (auto result_str = overlay_it->GetAttributeStringValue("requiredSystemPropertyValue")) { - info.requiredSystemPropertyValue = *result_str; - } - - return info; + return Error(" with android:name \"%s\" missing from AndroidManifest.xml of %s", + name.c_str(), path.c_str()); } } // namespace android::idmap2::utils diff --git a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp index c3a3e0ba90472..524aabcec6521 100644 --- a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp +++ b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp @@ -33,7 +33,7 @@ using ::testing::NotNull; namespace android::idmap2 { TEST(BinaryStreamVisitorTests, CreateBinaryStreamViaBinaryStreamVisitor) { - std::string raw(reinterpret_cast(idmap_raw_data), idmap_raw_data_len); + std::string raw(reinterpret_cast(idmap_raw_data), kIdmapRawDataLen); std::istringstream raw_stream(raw); auto result1 = Idmap::FromBinaryStream(raw_stream); diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp index e7e9e4cf5091c..a55b41b83c93c 100644 --- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp +++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp @@ -35,6 +35,7 @@ #include #include "R.h" +#include "TestConstants.h" #include "TestHelpers.h" #include "androidfw/PosixUtils.h" #include "gmock/gmock.h" @@ -43,6 +44,7 @@ #include "idmap2/Idmap.h" #include "private/android_filesystem_config.h" +using ::android::base::StringPrintf; using ::android::util::ExecuteBinary; using ::testing::NotNull; @@ -90,6 +92,7 @@ TEST_F(Idmap2BinaryTests, Create) { "create", "--target-apk-path", GetTargetApkPath(), "--overlay-apk-path", GetOverlayApkPath(), + "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT, "--idmap-path", GetIdmapPath()}); // clang-format on ASSERT_THAT(result, NotNull()); @@ -116,6 +119,7 @@ TEST_F(Idmap2BinaryTests, Dump) { "create", "--target-apk-path", GetTargetApkPath(), "--overlay-apk-path", GetOverlayApkPath(), + "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT, "--idmap-path", GetIdmapPath()}); // clang-format on ASSERT_THAT(result, NotNull()); @@ -128,14 +132,23 @@ TEST_F(Idmap2BinaryTests, Dump) { // clang-format on ASSERT_THAT(result, NotNull()); ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr; - ASSERT_NE(result->stdout.find(R::target::integer::literal::int1 + " -> 0x7f010000"), - std::string::npos); - ASSERT_NE(result->stdout.find(R::target::string::literal::str1 + " -> 0x7f020000"), - std::string::npos); - ASSERT_NE(result->stdout.find(R::target::string::literal::str3 + " -> 0x7f020001"), - std::string::npos); - ASSERT_NE(result->stdout.find(R::target::string::literal::str4 + " -> 0x7f020002"), - std::string::npos); + + ASSERT_NE(result->stdout.find(StringPrintf("0x%08x -> 0x%08x", R::target::integer::int1, + R::overlay::integer::int1)), + std::string::npos) + << result->stdout; + ASSERT_NE(result->stdout.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str1, + R::overlay::string::str1)), + std::string::npos) + << result->stdout; + ASSERT_NE(result->stdout.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str3, + R::overlay::string::str3)), + std::string::npos) + << result->stdout; + ASSERT_NE(result->stdout.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str4, + R::overlay::string::str4)), + std::string::npos) + << result->stdout; // clang-format off result = ExecuteBinary({"idmap2", @@ -167,6 +180,7 @@ TEST_F(Idmap2BinaryTests, Lookup) { "create", "--target-apk-path", GetTargetApkPath(), "--overlay-apk-path", GetOverlayApkPath(), + "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT, "--idmap-path", GetIdmapPath()}); // clang-format on ASSERT_THAT(result, NotNull()); @@ -177,7 +191,7 @@ TEST_F(Idmap2BinaryTests, Lookup) { "lookup", "--idmap-path", GetIdmapPath(), "--config", "", - "--resid", R::target::string::literal::str1}); + "--resid", StringPrintf("0x%08x", R::target::string::str1)}); // clang-format on ASSERT_THAT(result, NotNull()); ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr; @@ -229,6 +243,7 @@ TEST_F(Idmap2BinaryTests, InvalidCommandLineOptions) { "create", "--target-apk-path", GetTargetApkPath(), "--overlay-apk-path", GetOverlayApkPath(), + "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT, "--idmap-path"}); // clang-format on ASSERT_THAT(result, NotNull()); @@ -240,6 +255,7 @@ TEST_F(Idmap2BinaryTests, InvalidCommandLineOptions) { "create", "--target-apk-path", invalid_target_apk_path, "--overlay-apk-path", GetOverlayApkPath(), + "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT, "--idmap-path", GetIdmapPath()}); // clang-format on ASSERT_THAT(result, NotNull()); @@ -251,6 +267,7 @@ TEST_F(Idmap2BinaryTests, InvalidCommandLineOptions) { "create", "--target-apk-path", GetTargetApkPath(), "--overlay-apk-path", GetOverlayApkPath(), + "--overlay-name", TestConstants::OVERLAY_NAME_DEFAULT, "--idmap-path", GetIdmapPath(), "--policy", "this-does-not-exist"}); // clang-format on diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp index 7be1602ccf40d..c13b049eadfe6 100644 --- a/cmds/idmap2/tests/IdmapTests.cpp +++ b/cmds/idmap2/tests/IdmapTests.cpp @@ -27,6 +27,7 @@ #include "TestHelpers.h" #include "android-base/macros.h" #include "androidfw/ApkAssets.h" +#include "androidfw/ResourceUtils.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "idmap2/BinaryStreamVisitor.h" @@ -60,12 +61,12 @@ TEST(IdmapTests, TestCanonicalIdmapPathFor) { } TEST(IdmapTests, CreateIdmapHeaderFromBinaryStream) { - std::string raw(reinterpret_cast(idmap_raw_data), idmap_raw_data_len); + std::string raw(reinterpret_cast(idmap_raw_data), kIdmapRawDataLen); std::istringstream stream(raw); std::unique_ptr header = IdmapHeader::FromBinaryStream(stream); ASSERT_THAT(header, NotNull()); ASSERT_EQ(header->GetMagic(), 0x504d4449U); - ASSERT_EQ(header->GetVersion(), 0x06U); + ASSERT_EQ(header->GetVersion(), 0x07U); ASSERT_EQ(header->GetTargetCrc(), 0x1234U); ASSERT_EQ(header->GetOverlayCrc(), 0x5678U); ASSERT_EQ(header->GetFulfilledPolicies(), 0x11); @@ -76,9 +77,9 @@ TEST(IdmapTests, CreateIdmapHeaderFromBinaryStream) { } TEST(IdmapTests, CreateIdmapDataHeaderFromBinaryStream) { - const size_t offset = idmap_raw_data_offset; + const size_t offset = kIdmapRawDataOffset; std::string raw(reinterpret_cast(idmap_raw_data + offset), - idmap_raw_data_len - offset); + kIdmapRawDataLen - offset); std::istringstream stream(raw); std::unique_ptr header = IdmapData::Header::FromBinaryStream(stream); @@ -88,9 +89,9 @@ TEST(IdmapTests, CreateIdmapDataHeaderFromBinaryStream) { } TEST(IdmapTests, CreateIdmapDataFromBinaryStream) { - const size_t offset = idmap_raw_data_offset; + const size_t offset = kIdmapRawDataOffset; std::string raw(reinterpret_cast(idmap_raw_data + offset), - idmap_raw_data_len - offset); + kIdmapRawDataLen - offset); std::istringstream stream(raw); std::unique_ptr data = IdmapData::FromBinaryStream(stream); @@ -115,7 +116,7 @@ TEST(IdmapTests, CreateIdmapDataFromBinaryStream) { } TEST(IdmapTests, CreateIdmapFromBinaryStream) { - std::string raw(reinterpret_cast(idmap_raw_data), idmap_raw_data_len); + std::string raw(reinterpret_cast(idmap_raw_data), kIdmapRawDataLen); std::istringstream stream(raw); auto result = Idmap::FromBinaryStream(stream); @@ -124,13 +125,14 @@ TEST(IdmapTests, CreateIdmapFromBinaryStream) { ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); - ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x06U); + ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x07U); ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0x1234U); ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), 0x5678U); - ASSERT_EQ(idmap->GetHeader()->GetFulfilledPolicies(), 0x11); + ASSERT_EQ(idmap->GetHeader()->GetFulfilledPolicies(), kIdmapRawDataPolicies); ASSERT_EQ(idmap->GetHeader()->GetEnforceOverlayable(), true); - ASSERT_EQ(idmap->GetHeader()->GetTargetPath(), idmap_raw_data_target_path); - ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), idmap_raw_data_overlay_path); + ASSERT_EQ(idmap->GetHeader()->GetTargetPath(), kIdmapRawTargetPath); + ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), kIdmapRawOverlayPath); + ASSERT_EQ(idmap->GetHeader()->GetOverlayName(), kIdmapRawOverlayName); const std::vector>& dataBlocks = idmap->GetData(); ASSERT_EQ(dataBlocks.size(), 1U); @@ -175,48 +177,23 @@ TEST(IdmapTests, CreateIdmapHeaderFromApkAssets) { std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - auto idmap_result = Idmap::FromApkAssets(*target_apk, *overlay_apk, PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + auto idmap_result = Idmap::FromApkAssets( + *target_apk, *overlay_apk, TestConstants::OVERLAY_NAME_ALL_POLICIES, PolicyFlags::PUBLIC, + /* enforce_overlayable */ true); ASSERT_TRUE(idmap_result) << idmap_result.GetErrorMessage(); auto& idmap = *idmap_result; ASSERT_THAT(idmap, NotNull()); ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); - ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x06U); + ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x07U); ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), android::idmap2::TestConstants::TARGET_CRC); ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), android::idmap2::TestConstants::OVERLAY_CRC); ASSERT_EQ(idmap->GetHeader()->GetFulfilledPolicies(), PolicyFlags::PUBLIC); ASSERT_EQ(idmap->GetHeader()->GetEnforceOverlayable(), true); ASSERT_EQ(idmap->GetHeader()->GetTargetPath(), target_apk_path); ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), overlay_apk_path); -} - -Result> TestIdmapDataFromApkAssets( - const android::StringPiece& local_target_apk_path, - const android::StringPiece& local_overlay_apk_path, const OverlayManifestInfo& overlay_info, - const PolicyBitmask& fulfilled_policies, bool enforce_overlayable) { - const std::string target_apk_path(GetTestDataPath() + local_target_apk_path.data()); - std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); - if (!target_apk) { - return Error(R"(Failed to load target apk "%s")", target_apk_path.data()); - } - - const std::string overlay_apk_path(GetTestDataPath() + local_overlay_apk_path.data()); - std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); - if (!overlay_apk) { - return Error(R"(Failed to load overlay apk "%s")", overlay_apk_path.data()); - } - - LogInfo log_info; - auto mapping = ResourceMapping::FromApkAssets(*target_apk, *overlay_apk, overlay_info, - fulfilled_policies, enforce_overlayable, log_info); - - if (!mapping) { - return mapping.GetError(); - } - - return IdmapData::FromResourceMapping(*mapping); + ASSERT_EQ(idmap->GetHeader()->GetOverlayName(), TestConstants::OVERLAY_NAME_ALL_POLICIES); } TEST(IdmapTests, CreateIdmapDataFromApkAssets) { @@ -229,7 +206,8 @@ TEST(IdmapTests, CreateIdmapDataFromApkAssets) { std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - auto idmap_result = Idmap::FromApkAssets(*target_apk, *overlay_apk, PolicyFlags::PUBLIC, + auto idmap_result = Idmap::FromApkAssets(*target_apk, *overlay_apk, + TestConstants::OVERLAY_NAME_DEFAULT, PolicyFlags::PUBLIC, /* enforce_overlayable */ true); ASSERT_TRUE(idmap_result) << idmap_result.GetErrorMessage(); auto& idmap = *idmap_result; @@ -259,6 +237,29 @@ TEST(IdmapTests, CreateIdmapDataFromApkAssets) { ASSERT_OVERLAY_ENTRY(overlay_entries[3], R::overlay::string::str4, R::target::string::str4); } +TEST(IdmapTests, FailCreateIdmapInvalidName) { + std::string target_apk_path = GetTestDataPath() + "/target/target.apk"; + std::string overlay_apk_path = GetTestDataPath() + "/overlay/overlay.apk"; + + std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); + ASSERT_THAT(target_apk, NotNull()); + + std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); + ASSERT_THAT(overlay_apk, NotNull()); + + { + auto idmap_result = Idmap::FromApkAssets(*target_apk, *overlay_apk, "", PolicyFlags::PUBLIC, + /* enforce_overlayable */ true); + ASSERT_FALSE(idmap_result); + } + { + auto idmap_result = + Idmap::FromApkAssets(*target_apk, *overlay_apk, "unknown", PolicyFlags::PUBLIC, + /* enforce_overlayable */ true); + ASSERT_FALSE(idmap_result); + } +} + TEST(IdmapTests, CreateIdmapDataFromApkAssetsSharedLibOverlay) { std::string target_apk_path = GetTestDataPath() + "/target/target.apk"; std::string overlay_apk_path = GetTestDataPath() + "/overlay/overlay-shared.apk"; @@ -269,7 +270,8 @@ TEST(IdmapTests, CreateIdmapDataFromApkAssetsSharedLibOverlay) { std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - auto idmap_result = Idmap::FromApkAssets(*target_apk, *overlay_apk, PolicyFlags::PUBLIC, + auto idmap_result = Idmap::FromApkAssets(*target_apk, *overlay_apk, + TestConstants::OVERLAY_NAME_DEFAULT, PolicyFlags::PUBLIC, /* enforce_overlayable */ true); ASSERT_TRUE(idmap_result) << idmap_result.GetErrorMessage(); auto& idmap = *idmap_result; @@ -284,34 +286,67 @@ TEST(IdmapTests, CreateIdmapDataFromApkAssetsSharedLibOverlay) { const auto& target_entries = data->GetTargetEntries(); ASSERT_EQ(target_entries.size(), 4U); ASSERT_TARGET_ENTRY(target_entries[0], R::target::integer::int1, - R::overlay_shared::integer::int1); - ASSERT_TARGET_ENTRY(target_entries[1], R::target::string::str1, R::overlay_shared::string::str1); - ASSERT_TARGET_ENTRY(target_entries[2], R::target::string::str3, R::overlay_shared::string::str3); - ASSERT_TARGET_ENTRY(target_entries[3], R::target::string::str4, R::overlay_shared::string::str4); + fix_package_id(R::overlay::integer::int1, 0)); + ASSERT_TARGET_ENTRY(target_entries[1], R::target::string::str1, + fix_package_id(R::overlay::string::str1, 0)); + ASSERT_TARGET_ENTRY(target_entries[2], R::target::string::str3, + fix_package_id(R::overlay::string::str3, 0)); + ASSERT_TARGET_ENTRY(target_entries[3], R::target::string::str4, + fix_package_id(R::overlay::string::str4, 0)); const auto& target_inline_entries = data->GetTargetInlineEntries(); ASSERT_EQ(target_inline_entries.size(), 0U); const auto& overlay_entries = data->GetOverlayEntries(); ASSERT_EQ(target_entries.size(), 4U); - ASSERT_OVERLAY_ENTRY(overlay_entries[0], R::overlay_shared::integer::int1, + ASSERT_OVERLAY_ENTRY(overlay_entries[0], fix_package_id(R::overlay::integer::int1, 0), R::target::integer::int1); - ASSERT_OVERLAY_ENTRY(overlay_entries[1], R::overlay_shared::string::str1, + ASSERT_OVERLAY_ENTRY(overlay_entries[1], fix_package_id(R::overlay::string::str1, 0), R::target::string::str1); - ASSERT_OVERLAY_ENTRY(overlay_entries[2], R::overlay_shared::string::str3, + ASSERT_OVERLAY_ENTRY(overlay_entries[2], fix_package_id(R::overlay::string::str3, 0), R::target::string::str3); - ASSERT_OVERLAY_ENTRY(overlay_entries[3], R::overlay_shared::string::str4, + ASSERT_OVERLAY_ENTRY(overlay_entries[3], fix_package_id(R::overlay::string::str4, 0), R::target::string::str4); } +Result> TestIdmapDataFromApkAssets( + const std::string& local_target_apk_path, const std::string& local_overlay_apk_path, + const std::string& overlay_name, const PolicyBitmask& fulfilled_policies, + bool enforce_overlayable) { + auto overlay_info = + utils::ExtractOverlayManifestInfo(GetTestDataPath() + local_overlay_apk_path, overlay_name); + if (!overlay_info) { + return overlay_info.GetError(); + } + + const std::string target_apk_path(GetTestDataPath() + local_target_apk_path); + std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); + if (!target_apk) { + return Error(R"(Failed to load target apk "%s")", target_apk_path.data()); + } + + const std::string overlay_apk_path(GetTestDataPath() + local_overlay_apk_path); + std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); + if (!overlay_apk) { + return Error(R"(Failed to load overlay apk "%s")", overlay_apk_path.data()); + } + + LogInfo log_info; + auto mapping = ResourceMapping::FromApkAssets(*target_apk, *overlay_apk, *overlay_info, + fulfilled_policies, enforce_overlayable, log_info); + if (!mapping) { + return mapping.GetError(); + } + + return IdmapData::FromResourceMapping(*mapping); +} + TEST(IdmapTests, CreateIdmapDataDoNotRewriteNonOverlayResourceId) { - OverlayManifestInfo info{}; - info.target_package = "test.target"; - info.target_name = "TestResources"; - info.resource_mapping = 0x7f030001; // xml/overlays_different_packages - auto idmap_data = TestIdmapDataFromApkAssets("/target/target.apk", "/overlay/overlay.apk", info, - PolicyFlags::PUBLIC, - /* enforce_overlayable */ false); + auto idmap_data = + TestIdmapDataFromApkAssets("/target/target.apk", "/overlay/overlay.apk", "DifferentPackages", + + PolicyFlags::PUBLIC, + /* enforce_overlayable */ false); ASSERT_TRUE(idmap_data) << idmap_data.GetErrorMessage(); auto& data = *idmap_data; @@ -331,12 +366,8 @@ TEST(IdmapTests, CreateIdmapDataDoNotRewriteNonOverlayResourceId) { } TEST(IdmapTests, CreateIdmapDataInlineResources) { - OverlayManifestInfo info{}; - info.target_package = "test.target"; - info.target_name = "TestResources"; - info.resource_mapping = 0x7f030002; // xml/overlays_inline - auto idmap_data = TestIdmapDataFromApkAssets("/target/target.apk", "/overlay/overlay.apk", info, - PolicyFlags::PUBLIC, + auto idmap_data = TestIdmapDataFromApkAssets("/target/target.apk", "/overlay/overlay.apk", + "Inline", PolicyFlags::PUBLIC, /* enforce_overlayable */ false); ASSERT_TRUE(idmap_data) << idmap_data.GetErrorMessage(); @@ -345,7 +376,7 @@ TEST(IdmapTests, CreateIdmapDataInlineResources) { const auto& target_entries = data->GetTargetEntries(); ASSERT_EQ(target_entries.size(), 0U); - constexpr size_t overlay_string_pool_size = 8U; + constexpr size_t overlay_string_pool_size = 10U; const auto& target_inline_entries = data->GetTargetInlineEntries(); ASSERT_EQ(target_inline_entries.size(), 2U); ASSERT_TARGET_INLINE_ENTRY(target_inline_entries[0], R::target::integer::int1, @@ -361,13 +392,14 @@ TEST(IdmapTests, CreateIdmapDataInlineResources) { TEST(IdmapTests, IdmapHeaderIsUpToDate) { fclose(stderr); // silence expected warnings from libandroidfw - const std::string target_apk_path = idmap_raw_data_target_path; - const std::string overlay_apk_path = idmap_raw_data_overlay_path; - const PolicyBitmask policies = idmap_raw_data_policies; - const uint32_t target_crc = idmap_raw_data_target_crc; - const uint32_t overlay_crc = idmap_raw_data_overlay_crc; + const std::string target_apk_path = kIdmapRawTargetPath; + const std::string overlay_apk_path = kIdmapRawOverlayPath; + const std::string overlay_name = kIdmapRawOverlayName; + const PolicyBitmask policies = kIdmapRawDataPolicies; + const uint32_t target_crc = kIdmapRawDataTargetCrc; + const uint32_t overlay_crc = kIdmapRawOverlayCrc; - std::string raw(reinterpret_cast(idmap_raw_data), idmap_raw_data_len); + std::string raw(reinterpret_cast(idmap_raw_data), kIdmapRawDataLen); std::istringstream raw_stream(raw); auto result = Idmap::FromBinaryStream(raw_stream); @@ -380,8 +412,9 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { std::unique_ptr header = IdmapHeader::FromBinaryStream(stream); ASSERT_THAT(header, NotNull()); - ASSERT_TRUE(header->IsUpToDate(target_apk_path, overlay_apk_path, idmap_raw_data_target_crc, - overlay_crc, policies, /* enforce_overlayable */ true)); + ASSERT_TRUE(header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + kIdmapRawDataTargetCrc, overlay_crc, policies, + /* enforce_overlayable */ true)); // magic: bytes (0x0, 0x03) std::string bad_magic_string(stream.str()); @@ -394,8 +427,9 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_magic_stream); ASSERT_THAT(bad_magic_header, NotNull()); ASSERT_NE(header->GetMagic(), bad_magic_header->GetMagic()); - ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, /* enforce_overlayable */ true)); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, + /* enforce_overlayable */ true)); // version: bytes (0x4, 0x07) std::string bad_version_string(stream.str()); @@ -408,8 +442,9 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_version_stream); ASSERT_THAT(bad_version_header, NotNull()); ASSERT_NE(header->GetVersion(), bad_version_header->GetVersion()); - ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, /* enforce_overlayable */ true)); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, + /* enforce_overlayable */ true)); // target crc: bytes (0x8, 0xb) std::string bad_target_crc_string(stream.str()); @@ -422,8 +457,9 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_target_crc_stream); ASSERT_THAT(bad_target_crc_header, NotNull()); ASSERT_NE(header->GetTargetCrc(), bad_target_crc_header->GetTargetCrc()); - ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, /* enforce_overlayable */ true)); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, + /* enforce_overlayable */ true)); // overlay crc: bytes (0xc, 0xf) std::string bad_overlay_crc_string(stream.str()); @@ -436,8 +472,9 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_overlay_crc_stream); ASSERT_THAT(bad_overlay_crc_header, NotNull()); ASSERT_NE(header->GetOverlayCrc(), bad_overlay_crc_header->GetOverlayCrc()); - ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, /* enforce_overlayable */ true)); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, + /* enforce_overlayable */ true)); // fulfilled policy: bytes (0x10, 0x13) std::string bad_policy_string(stream.str()); @@ -450,8 +487,8 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_policy_stream); ASSERT_THAT(bad_policy_header, NotNull()); ASSERT_NE(header->GetFulfilledPolicies(), bad_policy_header->GetFulfilledPolicies()); - ASSERT_FALSE(bad_policy_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, + ASSERT_FALSE(bad_policy_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, /* enforce_overlayable */ true)); // enforce overlayable: bytes (0x14) @@ -462,8 +499,8 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_enforce_stream); ASSERT_THAT(bad_enforce_header, NotNull()); ASSERT_NE(header->GetEnforceOverlayable(), bad_enforce_header->GetEnforceOverlayable()); - ASSERT_FALSE(bad_enforce_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, + ASSERT_FALSE(bad_enforce_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, /* enforce_overlayable */ true)); // target path: bytes (0x1c, 0x27) @@ -474,8 +511,9 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_target_path_stream); ASSERT_THAT(bad_target_path_header, NotNull()); ASSERT_NE(header->GetTargetPath(), bad_target_path_header->GetTargetPath()); - ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, /* enforce_overlayable */ true)); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, + /* enforce_overlayable */ true)); // overlay path: bytes (0x2c, 0x37) std::string bad_overlay_path_string(stream.str()); @@ -485,9 +523,23 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_overlay_path_stream); ASSERT_THAT(bad_overlay_path_header, NotNull()); ASSERT_NE(header->GetOverlayPath(), bad_overlay_path_header->GetOverlayPath()); - ASSERT_FALSE(bad_overlay_path_header->IsUpToDate(target_apk_path, overlay_apk_path, target_crc, - overlay_crc, policies, + ASSERT_FALSE(bad_overlay_path_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, /* enforce_overlayable */ true)); + + // overlay path: bytes (0x3c, 0x47) + std::string bad_overlay_name_string(stream.str()); + bad_overlay_name_string[0x3c] = '\0'; + std::stringstream bad_overlay_name_stream(bad_overlay_name_string); + std::unique_ptr bad_overlay_name_header = + IdmapHeader::FromBinaryStream(bad_overlay_name_stream); + ASSERT_THAT(bad_overlay_name_header, NotNull()); + ASSERT_NE(header->GetOverlayName(), bad_overlay_name_header->GetOverlayName()); + ASSERT_FALSE(bad_overlay_name_header->IsUpToDate(target_apk_path, overlay_apk_path, overlay_name, + target_crc, overlay_crc, policies, + /* enforce_overlayable */ true)); + + // overlay name: bytes (0x2c, 0x37) } class TestVisitor : public Visitor { @@ -516,7 +568,7 @@ class TestVisitor : public Visitor { }; TEST(IdmapTests, TestVisitor) { - std::string raw(reinterpret_cast(idmap_raw_data), idmap_raw_data_len); + std::string raw(reinterpret_cast(idmap_raw_data), kIdmapRawDataLen); std::istringstream stream(raw); const auto idmap = Idmap::FromBinaryStream(stream); diff --git a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp index d30fbfcb1d3ce..87ce0f13d19ed 100644 --- a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp @@ -15,22 +15,21 @@ */ #include -#include #include #include "R.h" +#include "TestConstants.h" #include "TestHelpers.h" #include "androidfw/ApkAssets.h" -#include "androidfw/Idmap.h" #include "androidfw/ResourceTypes.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "idmap2/Idmap.h" #include "idmap2/PrettyPrintVisitor.h" -using ::testing::NotNull; - using android::ApkAssets; +using android::base::StringPrintf; +using ::testing::NotNull; using PolicyBitmask = android::ResTable_overlayable_policy_header::PolicyBitmask; using PolicyFlags = android::ResTable_overlayable_policy_header::PolicyFlags; @@ -46,7 +45,8 @@ TEST(PrettyPrintVisitorTests, CreatePrettyPrintVisitor) { std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - const auto idmap = Idmap::FromApkAssets(*target_apk, *overlay_apk, PolicyFlags::PUBLIC, + const auto idmap = Idmap::FromApkAssets(*target_apk, *overlay_apk, + TestConstants::OVERLAY_NAME_DEFAULT, PolicyFlags::PUBLIC, /* enforce_overlayable */ true); ASSERT_TRUE(idmap); @@ -56,15 +56,15 @@ TEST(PrettyPrintVisitorTests, CreatePrettyPrintVisitor) { ASSERT_NE(stream.str().find("target apk path : "), std::string::npos); ASSERT_NE(stream.str().find("overlay apk path : "), std::string::npos); - ASSERT_NE(stream.str().find(R::target::integer::literal::int1 + - " -> 0x7f010000 (integer/int1 -> integer/int1)\n"), + ASSERT_NE(stream.str().find(StringPrintf("0x%08x -> 0x%08x (integer/int1 -> integer/int1)\n", + R::target::integer::int1, R::overlay::integer::int1)), std::string::npos); } TEST(PrettyPrintVisitorTests, CreatePrettyPrintVisitorWithoutAccessToApks) { fclose(stderr); // silence expected warnings from libandroidfw - std::string raw(reinterpret_cast(idmap_raw_data), idmap_raw_data_len); + std::string raw(reinterpret_cast(idmap_raw_data), kIdmapRawDataLen); std::istringstream raw_stream(raw); const auto idmap = Idmap::FromBinaryStream(raw_stream); diff --git a/cmds/idmap2/tests/R.h b/cmds/idmap2/tests/R.h index 854b57fb22aa8..ac9b0580d2d94 100644 --- a/cmds/idmap2/tests/R.h +++ b/cmds/idmap2/tests/R.h @@ -23,22 +23,11 @@ namespace android::idmap2 { -static std::string hexify(ResourceId id) { - std::stringstream stream; - stream << std::hex << static_cast(id); - return stream.str(); -} - // clang-format off namespace R::target { namespace integer { // NOLINT(runtime/indentation_namespace) constexpr ResourceId int1 = 0x7f010000; - - namespace literal { // NOLINT(runtime/indentation_namespace) - inline const std::string int1 = hexify(R::target::integer::int1); - } } - namespace string { // NOLINT(runtime/indentation_namespace) constexpr ResourceId not_overlayable = 0x7f020003; constexpr ResourceId other = 0x7f020004; @@ -54,56 +43,31 @@ namespace R::target { constexpr ResourceId str1 = 0x7f02000e; constexpr ResourceId str3 = 0x7f020010; constexpr ResourceId str4 = 0x7f020011; - - namespace literal { // NOLINT(runtime/indentation_namespace) - inline const std::string str1 = hexify(R::target::string::str1); - inline const std::string str3 = hexify(R::target::string::str3); - inline const std::string str4 = hexify(R::target::string::str4); - } } // namespace string } // namespace R::target namespace R::overlay { namespace integer { // NOLINT(runtime/indentation_namespace) constexpr ResourceId int1 = 0x7f010000; + constexpr ResourceId not_in_target = 0x7f010001; } namespace string { // NOLINT(runtime/indentation_namespace) - constexpr ResourceId str1 = 0x7f020000; - constexpr ResourceId str3 = 0x7f020001; - constexpr ResourceId str4 = 0x7f020002; + constexpr ResourceId not_overlayable = 0x7f020000; + constexpr ResourceId other = 0x7f020001; + constexpr ResourceId policy_actor = 0x7f020002; + constexpr ResourceId policy_config_signature = 0x7f020003; + constexpr ResourceId policy_odm = 0x7f020004; + constexpr ResourceId policy_oem = 0x7f020005; + constexpr ResourceId policy_product = 0x7f020006; + constexpr ResourceId policy_public = 0x7f020007; + constexpr ResourceId policy_signature = 0x7f020008; + constexpr ResourceId policy_system = 0x7f020009; + constexpr ResourceId policy_system_vendor = 0x7f02000a; + constexpr ResourceId str1 = 0x7f02000b; + constexpr ResourceId str3 = 0x7f02000c; + constexpr ResourceId str4 = 0x7f02000d; } } - -namespace R::overlay_shared { - namespace integer { // NOLINT(runtime/indentation_namespace) - constexpr ResourceId int1 = 0x00010000; - } - namespace string { // NOLINT(runtime/indentation_namespace) - constexpr ResourceId str1 = 0x00020000; - constexpr ResourceId str3 = 0x00020001; - constexpr ResourceId str4 = 0x00020002; - } -} - -namespace R::system_overlay::string { - constexpr ResourceId policy_public = 0x7f010000; - constexpr ResourceId policy_system = 0x7f010001; - constexpr ResourceId policy_system_vendor = 0x7f010002; -} - -namespace R::system_overlay_invalid::string { - constexpr ResourceId not_overlayable = 0x7f010000; - constexpr ResourceId other = 0x7f010001; - constexpr ResourceId policy_actor = 0x7f010002; - constexpr ResourceId policy_config_signature = 0x7f010003; - constexpr ResourceId policy_odm = 0x7f010004; - constexpr ResourceId policy_oem = 0x7f010005; - constexpr ResourceId policy_product = 0x7f010006; - constexpr ResourceId policy_public = 0x7f010007; - constexpr ResourceId policy_signature = 0x7f010008; - constexpr ResourceId policy_system = 0x7f010009; - constexpr ResourceId policy_system_vendor = 0x7f01000a; -} // namespace R::system_overlay_invalid::string // clang-format on } // namespace android::idmap2 diff --git a/cmds/idmap2/tests/RawPrintVisitorTests.cpp b/cmds/idmap2/tests/RawPrintVisitorTests.cpp index b7ea22aa4a2e9..88f85efb0f84b 100644 --- a/cmds/idmap2/tests/RawPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/RawPrintVisitorTests.cpp @@ -56,8 +56,9 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - const auto idmap = Idmap::FromApkAssets(*target_apk, *overlay_apk, PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + const auto idmap = + Idmap::FromApkAssets(*target_apk, *overlay_apk, TestConstants::OVERLAY_NAME_DEFAULT, + PolicyFlags::PUBLIC, /* enforce_overlayable */ true); ASSERT_TRUE(idmap); std::stringstream stream; @@ -65,7 +66,7 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { (*idmap)->accept(&visitor); ASSERT_CONTAINS_REGEX(ADDRESS "504d4449 magic\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "00000006 version\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000007 version\n", stream.str()); ASSERT_CONTAINS_REGEX( StringPrintf(ADDRESS "%s target crc\n", android::idmap2::TestConstants::TARGET_CRC_STRING), stream.str()); @@ -76,22 +77,34 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { ASSERT_CONTAINS_REGEX(ADDRESS "00000001 enforce overlayable\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS " 7f target package id\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS " 7f overlay package id\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "00000004 target entry count\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "00000004 overlay entry count\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "00000004 overlay entry count\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "00000008 string pool index offset\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 target id: integer/int1\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 overlay id: integer/int1\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 overlay id: integer/int1\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 target id: integer/int1\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "000000b4 string pool size\n", stream.str()); - ASSERT_CONTAINS_REGEX("000001bc: ........ string pool\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000004 target entry count", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000000 target inline entry count", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000004 overlay entry count", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "0000000a string pool index offset", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 target id: integer/int1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 overlay id: integer/int1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000e target id: string/str1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000b overlay id: string/str1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020010 target id: string/str3", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000c overlay id: string/str3", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020011 target id: string/str4", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000d overlay id: string/str4", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 overlay id: integer/int1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 target id: integer/int1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000b overlay id: string/str1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000e target id: string/str1", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000c overlay id: string/str3", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020010 target id: string/str3", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f02000d overlay id: string/str4", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020011 target id: string/str4", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "000000b4 string pool size", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "........ string pool", stream.str()); } TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { fclose(stderr); // silence expected warnings from libandroidfw - std::string raw(reinterpret_cast(idmap_raw_data), idmap_raw_data_len); + std::string raw(reinterpret_cast(idmap_raw_data), kIdmapRawDataLen); std::istringstream raw_stream(raw); const auto idmap = Idmap::FromBinaryStream(raw_stream); @@ -102,11 +115,17 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { (*idmap)->accept(&visitor); ASSERT_CONTAINS_REGEX(ADDRESS "504d4449 magic\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "00000006 version\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000007 version\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00001234 target crc\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00005678 overlay crc\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000011 fulfilled policies: public|signature\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000001 enforce overlayable\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "0000000b target path size\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "........ target path: targetX.apk\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "0000000c overlay path size\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "........ overlay path: overlayX.apk\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "0000000b overlay name size\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "........ overlay name: OverlayName\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS " 7f target package id\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS " 7f overlay package id\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000003 target entry count\n", stream.str()); @@ -121,7 +140,7 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { ASSERT_CONTAINS_REGEX(ADDRESS "7f020000 overlay id\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "7f030002 target id\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000004 string pool size\n", stream.str()); - ASSERT_CONTAINS_REGEX("00000098: ........ string pool\n", stream.str()); + ASSERT_CONTAINS_REGEX("000000a8: ........ string pool\n", stream.str()); } } // namespace android::idmap2 diff --git a/cmds/idmap2/tests/ResourceMappingTests.cpp b/cmds/idmap2/tests/ResourceMappingTests.cpp index 185e9292346d0..0362529c4f3b5 100644 --- a/cmds/idmap2/tests/ResourceMappingTests.cpp +++ b/cmds/idmap2/tests/ResourceMappingTests.cpp @@ -17,12 +17,10 @@ #include // fclose #include #include -#include #include -#include -#include #include "R.h" +#include "TestConstants.h" #include "TestHelpers.h" #include "androidfw/ResourceTypes.h" #include "gmock/gmock.h" @@ -43,38 +41,32 @@ namespace android::idmap2 { ASSERT_TRUE(result) << result.GetErrorMessage(); \ } while (0) -Result TestGetResourceMapping(const android::StringPiece& local_target_apk_path, - const android::StringPiece& local_overlay_apk_path, - const OverlayManifestInfo& overlay_info, +Result TestGetResourceMapping(const std::string& local_target_apk_path, + const std::string& local_overlay_apk_path, + const std::string& overlay_name, const PolicyBitmask& fulfilled_policies, bool enforce_overlayable) { - const std::string target_apk_path(GetTestDataPath() + local_target_apk_path.data()); + auto overlay_info = + ExtractOverlayManifestInfo(GetTestDataPath() + local_overlay_apk_path, overlay_name); + if (!overlay_info) { + return overlay_info.GetError(); + } + + const std::string target_apk_path(GetTestDataPath() + local_target_apk_path); std::unique_ptr target_apk = ApkAssets::Load(target_apk_path); if (!target_apk) { return Error(R"(Failed to load target apk "%s")", target_apk_path.data()); } - const std::string overlay_apk_path(GetTestDataPath() + local_overlay_apk_path.data()); + const std::string overlay_apk_path(GetTestDataPath() + local_overlay_apk_path); std::unique_ptr overlay_apk = ApkAssets::Load(overlay_apk_path); if (!overlay_apk) { return Error(R"(Failed to load overlay apk "%s")", overlay_apk_path.data()); } LogInfo log_info; - return ResourceMapping::FromApkAssets(*target_apk, *overlay_apk, overlay_info, fulfilled_policies, - enforce_overlayable, log_info); -} - -Result TestGetResourceMapping(const android::StringPiece& local_target_apk_path, - const android::StringPiece& local_overlay_apk_path, - const PolicyBitmask& fulfilled_policies, - bool enforce_overlayable) { - auto overlay_info = ExtractOverlayManifestInfo(GetTestDataPath() + local_overlay_apk_path.data()); - if (!overlay_info) { - return overlay_info.GetError(); - } - return TestGetResourceMapping(local_target_apk_path, local_overlay_apk_path, *overlay_info, - fulfilled_policies, enforce_overlayable); + return ResourceMapping::FromApkAssets(*target_apk, *overlay_apk, *overlay_info, + fulfilled_policies, enforce_overlayable, log_info); } Result MappingExists(const ResourceMapping& mapping, ResourceId target_resource, @@ -136,13 +128,8 @@ Result MappingExists(const ResourceMapping& mapping, const ResourceId& tar } TEST(ResourceMappingTests, ResourcesFromApkAssetsLegacy) { - OverlayManifestInfo info{}; - info.target_package = "test.target"; - info.target_name = "TestResources"; - info.resource_mapping = 0U; // no xml - auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", info, - PolicyFlags::PUBLIC, - /* enforce_overlayable */ false); + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay-legacy.apk", "", + PolicyFlags::PUBLIC, /* enforce_overlayable */ false); ASSERT_TRUE(resources) << resources.GetErrorMessage(); auto& res = *resources; @@ -158,11 +145,7 @@ TEST(ResourceMappingTests, ResourcesFromApkAssetsLegacy) { } TEST(ResourceMappingTests, ResourcesFromApkAssetsNonMatchingNames) { - OverlayManifestInfo info{}; - info.target_package = "test.target"; - info.target_name = "TestResources"; - info.resource_mapping = 0x7f030003; // xml/overlays_swap - auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", info, + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", "SwapNames", PolicyFlags::PUBLIC, /* enforce_overlayable */ false); @@ -178,12 +161,8 @@ TEST(ResourceMappingTests, ResourcesFromApkAssetsNonMatchingNames) { } TEST(ResourceMappingTests, DoNotRewriteNonOverlayResourceId) { - OverlayManifestInfo info{}; - info.target_package = "test.target"; - info.target_name = "TestResources"; - info.resource_mapping = 0x7f030001; // xml/overlays_different_packages - auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", info, - PolicyFlags::PUBLIC, + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", + "DifferentPackages", PolicyFlags::PUBLIC, /* enforce_overlayable */ false); ASSERT_TRUE(resources) << resources.GetErrorMessage(); @@ -192,19 +171,15 @@ TEST(ResourceMappingTests, DoNotRewriteNonOverlayResourceId) { ASSERT_EQ(res.GetOverlayToTargetMap().size(), 1U); ASSERT_RESULT(MappingExists(res, R::target::string::str1, 0x0104000a, false /* rewrite */)); // -> android:string/ok - ASSERT_RESULT(MappingExists(res, R::target::string::str3, 0x7f020001, true /* rewrite */)); + ASSERT_RESULT( + MappingExists(res, R::target::string::str3, R::overlay::string::str3, true /* rewrite */)); } TEST(ResourceMappingTests, InlineResources) { - OverlayManifestInfo info{}; - info.target_package = "test.target"; - info.target_name = "TestResources"; - info.resource_mapping = 0x7f030002; // xml/overlays_inline - auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", info, - PolicyFlags::PUBLIC, - /* enforce_overlayable */ false); + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", "Inline", + PolicyFlags::PUBLIC, /* enforce_overlayable */ false); - constexpr size_t overlay_string_pool_size = 8U; + constexpr size_t overlay_string_pool_size = 10U; ASSERT_TRUE(resources) << resources.GetErrorMessage(); auto& res = *resources; ASSERT_EQ(res.GetTargetToOverlayMap().size(), 2U); @@ -215,28 +190,8 @@ TEST(ResourceMappingTests, InlineResources) { } TEST(ResourceMappingTests, CreateIdmapFromApkAssetsPolicySystemPublic) { - auto resources = - TestGetResourceMapping("/target/target.apk", "/system-overlay/system-overlay.apk", - PolicyFlags::SYSTEM_PARTITION | PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); - - ASSERT_TRUE(resources) << resources.GetErrorMessage(); - auto& res = *resources; - ASSERT_EQ(res.GetTargetToOverlayMap().size(), 3U); - ASSERT_RESULT(MappingExists(res, R::target::string::policy_public, - R::system_overlay::string::policy_public, false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::policy_system, - R::system_overlay::string::policy_system, false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::policy_system_vendor, - R::system_overlay::string::policy_system_vendor, - false /* rewrite */)); -} - -// Resources that are not declared as overlayable and resources that a protected by policies the -// overlay does not fulfill must not map to overlay resources. -TEST(ResourceMappingTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { - auto resources = TestGetResourceMapping("/target/target.apk", - "/system-overlay-invalid/system-overlay-invalid.apk", + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", + TestConstants::OVERLAY_NAME_ALL_POLICIES, PolicyFlags::SYSTEM_PARTITION | PolicyFlags::PUBLIC, /* enforce_overlayable */ true); @@ -244,22 +199,38 @@ TEST(ResourceMappingTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { auto& res = *resources; ASSERT_EQ(res.GetTargetToOverlayMap().size(), 3U); ASSERT_RESULT(MappingExists(res, R::target::string::policy_public, - R::system_overlay_invalid::string::policy_public, - false /* rewrite */)); + R::overlay::string::policy_public, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_system, - R::system_overlay_invalid::string::policy_system, - false /* rewrite */)); + R::overlay::string::policy_system, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_system_vendor, - R::system_overlay_invalid::string::policy_system_vendor, - false /* rewrite */)); + R::overlay::string::policy_system_vendor, true /* rewrite */)); +} + +// Resources that are not declared as overlayable and resources that a protected by policies the +// overlay does not fulfill must not map to overlay resources. +TEST(ResourceMappingTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", + TestConstants::OVERLAY_NAME_ALL_POLICIES, + PolicyFlags::SYSTEM_PARTITION | PolicyFlags::PUBLIC, + /* enforce_overlayable */ true); + + ASSERT_TRUE(resources) << resources.GetErrorMessage(); + auto& res = *resources; + ASSERT_EQ(res.GetTargetToOverlayMap().size(), 3U); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_public, + R::overlay::string::policy_public, true /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_system, + R::overlay::string::policy_system, true /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_system_vendor, + R::overlay::string::policy_system_vendor, true /* rewrite */)); } // Resources that are not declared as overlayable and resources that a protected by policies the // overlay does not fulfilled can map to overlay resources when overlayable enforcement is turned // off. TEST(ResourceMappingTests, ResourcesFromApkAssetsPolicySystemPublicInvalidIgnoreOverlayable) { - auto resources = TestGetResourceMapping("/target/target.apk", - "/system-overlay-invalid/system-overlay-invalid.apk", + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay.apk", + TestConstants::OVERLAY_NAME_ALL_POLICIES, PolicyFlags::SYSTEM_PARTITION | PolicyFlags::PUBLIC, /* enforce_overlayable */ false); @@ -267,41 +238,33 @@ TEST(ResourceMappingTests, ResourcesFromApkAssetsPolicySystemPublicInvalidIgnore auto& res = *resources; ASSERT_EQ(res.GetTargetToOverlayMap().size(), 11U); ASSERT_RESULT(MappingExists(res, R::target::string::not_overlayable, - R::system_overlay_invalid::string::not_overlayable, - false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::other, - R::system_overlay_invalid::string::other, false /* rewrite */)); + R::overlay::string::not_overlayable, true /* rewrite */)); + ASSERT_RESULT( + MappingExists(res, R::target::string::other, R::overlay::string::other, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_actor, - R::system_overlay_invalid::string::policy_actor, - false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::policy_odm, - R::system_overlay_invalid::string::policy_odm, false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::policy_oem, - R::system_overlay_invalid::string::policy_oem, false /* rewrite */)); + R::overlay::string::policy_actor, true /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_odm, R::overlay::string::policy_odm, + true /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_oem, R::overlay::string::policy_oem, + true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_product, - R::system_overlay_invalid::string::policy_product, - false /* rewrite */)); + R::overlay::string::policy_product, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_public, - R::system_overlay_invalid::string::policy_public, - false /* rewrite */)); + R::overlay::string::policy_public, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_config_signature, - R::system_overlay_invalid::string::policy_config_signature, - false /* rewrite */)); + R::overlay::string::policy_config_signature, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_signature, - R::system_overlay_invalid::string::policy_signature, - false /* rewrite */)); + R::overlay::string::policy_signature, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_system, - R::system_overlay_invalid::string::policy_system, - false /* rewrite */)); + R::overlay::string::policy_system, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_system_vendor, - R::system_overlay_invalid::string::policy_system_vendor, - false /* rewrite */)); + R::overlay::string::policy_system_vendor, true /* rewrite */)); } -// Overlays that do not target an tag can overlay resources defined within any -// tag. +// Overlays that do not target an tag can overlay any resource if overlayable +// enforcement is disabled. TEST(ResourceMappingTests, ResourcesFromApkAssetsNoDefinedOverlayableAndNoTargetName) { - auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay-no-name.apk", + auto resources = TestGetResourceMapping("/target/target.apk", "/overlay/overlay-legacy.apk", "", PolicyFlags::PUBLIC, /* enforce_overlayable */ false); @@ -321,9 +284,10 @@ TEST(ResourceMappingTests, ResourcesFromApkAssetsNoDefinedOverlayableAndNoTarget // Overlays that are neither pre-installed nor signed with the same signature as the target cannot // overlay packages that have not defined overlayable resources. TEST(ResourceMappingTests, ResourcesFromApkAssetsDefaultPoliciesPublicFail) { - auto resources = TestGetResourceMapping("/target/target-no-overlayable.apk", - "/overlay/overlay-no-name.apk", PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + auto resources = + TestGetResourceMapping("/target/target-no-overlayable.apk", "/overlay/overlay.apk", + "NoTargetName", PolicyFlags::PUBLIC, + /* enforce_overlayable */ true); ASSERT_TRUE(resources) << resources.GetErrorMessage(); ASSERT_EQ(resources->GetTargetToOverlayMap().size(), 0U); @@ -334,46 +298,36 @@ TEST(ResourceMappingTests, ResourcesFromApkAssetsDefaultPoliciesPublicFail) { // defined overlayable resources. TEST(ResourceMappingTests, ResourcesFromApkAssetsDefaultPolicies) { auto CheckEntries = [&](const PolicyBitmask& fulfilled_policies) -> void { - auto resources = TestGetResourceMapping("/target/target-no-overlayable.apk", - "/system-overlay-invalid/system-overlay-invalid.apk", - fulfilled_policies, - /* enforce_overlayable */ true); + auto resources = + TestGetResourceMapping("/target/target-no-overlayable.apk", "/overlay/overlay.apk", + TestConstants::OVERLAY_NAME_ALL_POLICIES, fulfilled_policies, + /* enforce_overlayable */ true); ASSERT_TRUE(resources) << resources.GetErrorMessage(); auto& res = *resources; ASSERT_EQ(resources->GetTargetToOverlayMap().size(), 11U); ASSERT_RESULT(MappingExists(res, R::target::string::not_overlayable, - R::system_overlay_invalid::string::not_overlayable, - false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::other, - R::system_overlay_invalid::string::other, false /* rewrite */)); + R::overlay::string::not_overlayable, true /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::other, R::overlay::string::other, + true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_actor, - R::system_overlay_invalid::string::policy_actor, - false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::policy_odm, - R::system_overlay_invalid::string::policy_odm, - false /* rewrite */)); - ASSERT_RESULT(MappingExists(res, R::target::string::policy_oem, - R::system_overlay_invalid::string::policy_oem, - false /* rewrite */)); + R::overlay::string::policy_actor, true /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_odm, R::overlay::string::policy_odm, + true /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_oem, R::overlay::string::policy_oem, + true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_product, - R::system_overlay_invalid::string::policy_product, - false /* rewrite */)); + R::overlay::string::policy_product, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_public, - R::system_overlay_invalid::string::policy_public, - false /* rewrite */)); + R::overlay::string::policy_public, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_config_signature, - R::system_overlay_invalid::string::policy_config_signature, - false /* rewrite */)); + R::overlay::string::policy_config_signature, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_signature, - R::system_overlay_invalid::string::policy_signature, - false /* rewrite */)); + R::overlay::string::policy_signature, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_system, - R::system_overlay_invalid::string::policy_system, - false /* rewrite */)); + R::overlay::string::policy_system, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_system_vendor, - R::system_overlay_invalid::string::policy_system_vendor, - false /* rewrite */)); + R::overlay::string::policy_system_vendor, true /* rewrite */)); }; CheckEntries(PolicyFlags::SIGNATURE); diff --git a/cmds/idmap2/tests/TestConstants.h b/cmds/idmap2/tests/TestConstants.h index 69575b8f9c018..d5799adf0ec32 100644 --- a/cmds/idmap2/tests/TestConstants.h +++ b/cmds/idmap2/tests/TestConstants.h @@ -22,8 +22,11 @@ namespace android::idmap2::TestConstants { constexpr const auto TARGET_CRC = 0x7c2d4719; constexpr const auto TARGET_CRC_STRING = "7c2d4719"; -constexpr const auto OVERLAY_CRC = 0x5afff726; -constexpr const auto OVERLAY_CRC_STRING = "5afff726"; +constexpr const auto OVERLAY_CRC = 0xb71095cf; +constexpr const auto OVERLAY_CRC_STRING = "b71095cf"; + +constexpr const char* OVERLAY_NAME_DEFAULT = "Default"; +constexpr const char* OVERLAY_NAME_ALL_POLICIES = "AllPolicies"; } // namespace android::idmap2::TestConstants diff --git a/cmds/idmap2/tests/TestHelpers.h b/cmds/idmap2/tests/TestHelpers.h index 5c934a33ebb66..842af3dd7b3c0 100644 --- a/cmds/idmap2/tests/TestHelpers.h +++ b/cmds/idmap2/tests/TestHelpers.h @@ -30,7 +30,7 @@ const unsigned char idmap_raw_data[] = { 0x49, 0x44, 0x4d, 0x50, // 0x4: version - 0x06, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, // 0x8: target crc 0x34, 0x12, 0x00, 0x00, @@ -56,95 +56,102 @@ const unsigned char idmap_raw_data[] = { // 0x2c: overlay path "overlayX.apk" 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x58, 0x2e, 0x61, 0x70, 0x6b, - // 0x38: debug string + // 0x38: overlay name length + 0x0b, 0x00, 0x00, 0x00, + + // 0x3c: overlay name "OverlayName" + 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6D, 0x65, 0x00, + + // 0x48 -> 4c: debug string // string length, 0x05, 0x00, 0x00, 0x00, - // 0x3c string contents "debug\0\0\0" (padded to word alignment) + // 0x4c string contents "debug\0\0\0" (padded to word alignment) 0x64, 0x65, 0x62, 0x75, 0x67, 0x00, 0x00, 0x00, // DATA HEADER - // 0x44: target_package_id + // 0x54: target_package_id 0x7f, - // 0x45: overlay_package_id + // 0x55: overlay_package_id 0x7f, - // 0x46: padding + // 0x56: padding 0x00, 0x00, - // 0x48: target_entry_count + // 0x58: target_entry_count 0x03, 0x00, 0x00, 0x00, - // 0x4c: target_inline_entry_count + // 0x5c: target_inline_entry_count 0x01, 0x00, 0x00, 0x00, - // 0x50: overlay_entry_count + // 0x60: overlay_entry_count 0x03, 0x00, 0x00, 0x00, - // 0x54: string_pool_offset + // 0x64: string_pool_offset 0x00, 0x00, 0x00, 0x00, // TARGET ENTRIES - // 0x58: target id (0x7f020000) + // 0x68: target id (0x7f020000) 0x00, 0x00, 0x02, 0x7f, - // 0x5c: overlay_id (0x7f020000) + // 0x6c: overlay_id (0x7f020000) 0x00, 0x00, 0x02, 0x7f, - // 0x60: target id (0x7f030000) + // 0x70: target id (0x7f030000) 0x00, 0x00, 0x03, 0x7f, - // 0x64: overlay_id (0x7f030000) + // 0x74: overlay_id (0x7f030000) 0x00, 0x00, 0x03, 0x7f, - // 0x68: target id (0x7f030002) + // 0x78: target id (0x7f030002) 0x02, 0x00, 0x03, 0x7f, - // 0x6c: overlay_id (0x7f030001) + // 0x7c: overlay_id (0x7f030001) 0x01, 0x00, 0x03, 0x7f, // INLINE TARGET ENTRIES - // 0x70: target_id + // 0x80: target_id 0x00, 0x00, 0x04, 0x7f, - // 0x74: Res_value::size (value ignored by idmap) + // 0x84: Res_value::size (value ignored by idmap) 0x08, 0x00, - // 0x77: Res_value::res0 (value ignored by idmap) + // 0x87: Res_value::res0 (value ignored by idmap) 0x00, - // 0x78: Res_value::dataType (TYPE_INT_HEX) + // 0x88: Res_value::dataType (TYPE_INT_HEX) 0x11, - // 0x7c: Res_value::data + // 0x8c: Res_value::data 0x78, 0x56, 0x34, 0x12, // OVERLAY ENTRIES - // 0x80: 0x7f020000 -> 0x7f020000 + // 0x90: 0x7f020000 -> 0x7f020000 0x00, 0x00, 0x02, 0x7f, 0x00, 0x00, 0x02, 0x7f, - // 0x88: 0x7f030000 -> 0x7f030000 + // 0x98: 0x7f030000 -> 0x7f030000 0x00, 0x00, 0x03, 0x7f, 0x00, 0x00, 0x03, 0x7f, - // 0x90: 0x7f030001 -> 0x7f030002 + // 0xa0: 0x7f030001 -> 0x7f030002 0x01, 0x00, 0x03, 0x7f, 0x02, 0x00, 0x03, 0x7f, - // 0x94: string pool + // 0xa4: string pool // string length, 0x04, 0x00, 0x00, 0x00, - // 0x98 string contents "test" + // 0xa8 string contents "test" 0x74, 0x65, 0x73, 0x74}; -const unsigned int idmap_raw_data_len = 0x9c; -const unsigned int idmap_raw_data_offset = 0x44; -const unsigned int idmap_raw_data_target_crc = 0x1234; -const unsigned int idmap_raw_data_overlay_crc = 0x5678; -const unsigned int idmap_raw_data_policies = 0x11; -inline const std::string idmap_raw_data_target_path = "targetX.apk"; -inline const std::string idmap_raw_data_overlay_path = "overlayX.apk"; +const unsigned int kIdmapRawDataLen = 0xac; +const unsigned int kIdmapRawDataOffset = 0x54; +const unsigned int kIdmapRawDataTargetCrc = 0x1234; +const unsigned int kIdmapRawOverlayCrc = 0x5678; +const unsigned int kIdmapRawDataPolicies = 0x11; +inline const std::string kIdmapRawTargetPath = "targetX.apk"; +inline const std::string kIdmapRawOverlayPath = "overlayX.apk"; +inline const std::string kIdmapRawOverlayName = "OverlayName"; std::string GetTestDataPath(); diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifest.xml b/cmds/idmap2/tests/data/overlay/AndroidManifest.xml index cf3691c3b3cf6..2c50dee05b110 100644 --- a/cmds/idmap2/tests/data/overlay/AndroidManifest.xml +++ b/cmds/idmap2/tests/data/overlay/AndroidManifest.xml @@ -13,14 +13,37 @@ See the License for the specific language governing permissions and limitations under the License. --> - - + - + + + + + + + + + + + + diff --git a/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestLegacy.xml similarity index 71% rename from cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml rename to cmds/idmap2/tests/data/overlay/AndroidManifestLegacy.xml index 9e6a4536cb51c..9fc2105fe827d 100644 --- a/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml +++ b/cmds/idmap2/tests/data/overlay/AndroidManifestLegacy.xml @@ -1,5 +1,5 @@ - - + - + + diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml deleted file mode 100644 index bc6b733e849fa..0000000000000 --- a/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml deleted file mode 100644 index ed327ce0e630f..0000000000000 --- a/cmds/idmap2/tests/data/overlay/AndroidManifestNoNameStatic.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml deleted file mode 100644 index 1c4dae6cf69c7..0000000000000 --- a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic1.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml deleted file mode 100644 index 70efc86036708..0000000000000 --- a/cmds/idmap2/tests/data/overlay/AndroidManifestStatic2.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/cmds/idmap2/tests/data/overlay/build b/cmds/idmap2/tests/data/overlay/build index 114b099598faf..1f1cedb052719 100755 --- a/cmds/idmap2/tests/data/overlay/build +++ b/cmds/idmap2/tests/data/overlay/build @@ -26,37 +26,16 @@ aapt2 link \ 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" \ - --manifest AndroidManifestStatic1.xml \ - -o overlay-static-1.apk \ - compiled.flata - -aapt2 link \ - --no-resource-removal \ - -I "$FRAMEWORK_RES_APK" \ - --manifest AndroidManifestStatic2.xml \ - -o overlay-static-2.apk \ - compiled.flata - -aapt2 link \ - --no-resource-removal \ - --shared-lib \ - -I "$FRAMEWORK_RES_APK" \ --manifest AndroidManifest.xml \ -o overlay-shared.apk \ + --shared-lib \ + compiled.flata + +aapt2 link \ + --no-resource-removal \ + -I "$FRAMEWORK_RES_APK" \ + --manifest AndroidManifestLegacy.xml \ + -o overlay-legacy.apk \ compiled.flata rm compiled.flata diff --git a/cmds/idmap2/tests/data/overlay/overlay-legacy.apk b/cmds/idmap2/tests/data/overlay/overlay-legacy.apk new file mode 100644 index 0000000000000000000000000000000000000000..f03eebbf6872993a96d3c71eb7b48ed84cfd0a52 GIT binary patch literal 4708 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 literal 0 HcmV?d00001 diff --git a/cmds/idmap2/tests/data/overlay/overlay-no-name-static.apk b/cmds/idmap2/tests/data/overlay/overlay-no-name-static.apk deleted file mode 100644 index dab25b1f81317f6d7366993527bba85fb1d8f4f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3485 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 DsF#mG diff --git a/cmds/idmap2/tests/data/overlay/overlay-shared.apk b/cmds/idmap2/tests/data/overlay/overlay-shared.apk index 0a8b7372172e92f79c466bc02f6d99886b2ebdeb..3c896ea79505a65c8fa481ed4a82e6376c7014ee 100644 GIT binary patch literal 5216 zcmd^Dc|4Tc8$V_+vhT*4EEU%>BZ>@H=^CME(MpUlG=*VitQWZ@w*_6?N;i~9lq;1= zNs>}o+U!duBH0>c&5hrA$4oT*KA&H|fA9HxzVGuqXL;W9Jm-1NIq&OakLCxk2mugv zhVMzV-N8T<0BslmWMJ(oKTkT1>bZ{ONA;pGm zqNP_RM?AfPyKY_^31bcZ4X{3MAETG!CyImngs)p$WbLRm?>X|tF5*IDV`^JuL{53*H zb6ooS1F@6Y05Zd zM1Bgkel4MHJw<#(+jps;A*6F?qM+ld(x@4e7-9A`=)-4SCASWSYea8PQEKwue)Ge( zPIN3fb4i@I&MdZ!Fy#CS=l*LkN+)HVT$EJEMI(kJS z`Lfq-0v5=3-dTP_=hx*zCmrGgVDUW8a`U8mc~R&T zKc<^MiM*HOO<}vw@rv+$oa`NA>ZV+4ISi)sq4OHqlKW@6CGFCkv#+#ub-VS-?UKB7 zKp~zO|7-AJnvRl;9bmkqzS_sI1fKbJu}Q=q-d^Vv)F^P&22 zj4Xmif;&TE@;U8oXWQCx3(X3Jg$JGrSnI42!OOR*d=;8K@s>t|=Y?wtcFsu==j-^WJJMqHGSfCG2qXp(G5?D4-ORkP?v9VMQpOhFg$v>rfy`dt+pyO8T z@ajEQR~sZ!6mBtkw+}a&{PUvDXK1QXGS9JKdG5=~8-K@r%qyRY?Bz*}i&{oir=i_g zK>$?ev)!NOLnTuw(-~6hxcPC)Z)e~3Q`(qA=Tr@A!XwTogs-PueT*HmjM%{1 zx@EQG^GCi3=PSzy+drL)Zpv*kIQoya>$BhwD;-0ejk-rqiyW!z+V}gm0G+wGkUWhi=%BbXqt4LT72#FQ=MwE8-6J%GdWv@&Deuxu`F8>B{Dd zOFu`C&})icGij`drnjMiH_R1XHjhp0i&rB5vT)OzjRcfOq_4>-{jax@HY5gU)l`Mw zo;1H%ZzS@-Oe8J2zSX3+sm^FI8k>h}RkNujIjG^X(AYHG9kuf8vSds52WYIMU>LSK zgQ_@M)I9z*^(){eJmQlxd;_UUk>LvfKp;Nt9$Fxs41=6RXOK}ql-&Ze0`LJ9pbi;f z$g>ON*Km1AMIaO)G$B?(kRg79NQWqfsDcm@nm%Qyo?yWO&Vi$kpT#c&va<6XNMP|| z-s<_cUZAWzr{m0?1yoh%w9d|Ipr|;fof{uORP@`7^%+64L}Nq*0Hx071TTU}VFC(Z zz^4JAfgs4!fe#>o(CNm1!4ruSq%b)Y;gR^+3@I8BIAtl9fm9ko0|Eo6z>n=gZ?@+E z5M=w3&aU@{JlB5FEeCmaf$#I@@{q!dI6EfskgkH*1`!5v3?dT(iOV_& z7K9KSy9B}j!UTc-SlM)h-JlIY$PCQwk|M1~tu&*4cP zJ`~uK+d^aRrqE$@b7gkeg}RZ*Od1_5T*y;RrulhMz1kvXbwL= zgGt9vlV#Jy_*?FWGJuj2XE`!9VF8`L3i5LOUQ5bhBE5K$0+K%9lhhqwp9wGo*Iw2__4h|LHy zTSn$STNdDv;SKA%b|g<{_eXTjmf_*_os678v)hrgXSOWLBa3ll&f2io0_l&~f%rBT zQiMm=XtrWa18YK!O;Q}FRgp_~#8R}%uhlC_7&_nb5U7Bv=KIi$@G)Do?hd*~H09o)wy!RgD zO3bT)_iK1YLk)}oUJY~i_W5-3esRv|EQ7nq9Gx?FIo`?fe!k5pDuLlQM-lfVnQuAZuql$Y&oS6|EFwfn3Moj@+QmAIuP20&{07(jXW5Iv{m;x?H>VW?MVxQ68 delta 1956 zcmZ8i3pi9;6h3FhkTElc8Lya7dEXdCqSW~ED&B?XBB^F>lwv41S9zr4mCsEi z-12Oi@@mRRB_UCIkVoAqQX0KXRCk}bd|h{a=byFr+W%hrthLuVGh|#z<9WJaYqEirRSH=zqPVH8#dpWaon!-p!GuZutiy2O4V(MT{o+(*m&_YwDK`8@E_c^6 zhlL%h&eo)a6L@|O2dpdoK1|;h1SF!pTh1Y3qY+mTD)MQbv-`~qW-)~8{hkN+7ZiiKAY=-UIy)Tq~ z5|QqV=rd2$KbS{pSud?x{>Drf;RYz(OO2^A+ZP5go`( zsXpQMwx(mu(kK1kO8e{LBW>Tx%GjHq*a+`(t2n-$@!xNp+sF!N$bPDSVc+>%isua- z4gaEgXGSF~=1E%3mQ9cgwWUTU`nIJ@Ot*=e1{*pRr;i65dr_8HvWe>c;H8qY8#htB zrDWUfcJYqV6Z^EF!EzzxG?(rn2>L!a@5be!KKGHVuSh*cpSOA!xYwjt?p;Ag16500wOln= z^x)VfLA>8k<5w_SF z;b`yG)tmp+v$|LNlRGilDSUI(1>3kptIB7SK`~DCeE)21r9q1dDT7K&FMS$jM367M zVtV&5&pm*-zx`s=@ARxxy;baK3v7YUy=sNa3twceEsa0FMrd?+tYJKI6nT`MLtC~w z*WdAri8xkxZ{*g&iebw)&og~il-g@1(lH9_1)4piTNMgRsLrp0UaPYnHM_>r^$4pb zHhx=iisbzCXi-v8LCiyX6n{+mmM2m8HzR6uO)#Tcb@n1C{y#t?7$VIW3PPi(^U^$O z@gh34$try7_?FgYhrRpMR9dUw8`&joDaTu?_v?JybxowSWB+@RC-XU ze449wib2?hwYZAgSw_WQbY2p>?XZ%iBcs+mhc<}E94~ttT3a9S%J=8%`q#21U6ON1 z-v)x!25MP(YM+J!1Ls{agmlYE$)LI08{0)gAg%-q1Zkmh@dCLq!F$oBPRqQ87onHW zk*Y+_m{G?stEs&Gh?6_io;R`pP9u9XcP2~h_xGkbr<^3V)U?+OF6%BI9)a+2OgMTA z-fw7YTm&Pn+*VNXsQ1{|r&GQ8k3(3odGB`Tl@z62dhAyhwWEXNP_yoIr1qa))w+>6 zC6c_AQr=i;-~d5rv3kt}b$5omhR-2kmlu&RN*pt6rQ9FR?OVbxwo%eD&~jOxaoVG= zx>1nhuh;26M6ayB7;wof?6N7H8C+*TplVjGOO3`IGa^(c72#7q>pGWVup-7NZLDKz zAiInA;|XmpBOrW`iHHbxSGhbC41phr1YsdgD0k0(4l9&v9?apg00{#TWQ(8#AQ;kt z#?g%cG6BXlb7PzW~?(cmuE@QYBOb`GB$-d%1qXJ{R zp#-4k)`Gy8fmq_#BR5EL$a|8Wnk=sWvyg|%>k$TC&iV%sGT4JgjQRi?3o<2}qvxP= z^ffUUGNcEz?0h7Vtf5jeHv>8ZVD40cJ?aYwfbO033C;S%qWjTx)F-+=dxp%0&T;$= zDta(+-X9bat!kwUEVAzx*!K}Qr2_p^CSasZbqUIu*U>)-V5E&jY85ERBFbWvcU-W2 zT??=lfb?k3;AtZyD$xn>X6tOW%>GNHfzam{ou?ZPO$W${ NJai76{}C-K=pTGnsV)Ej diff --git a/cmds/idmap2/tests/data/overlay/overlay-static-1.apk b/cmds/idmap2/tests/data/overlay/overlay-static-1.apk deleted file mode 100644 index fd41182f84936793abd12a2ae9ae9923df23e8a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3477 zcmds3dpy+X8h>Zx&afqST{y%k#)KTnm~4h!iI$Ok6oa9OhBGsXjglluw`ps;NOGxl z?~q(l+fr?EIY*IALbjq4xgXM6=Xr;rhR^w9_rLRe<~z^j{k_loywCIAT%9BqARrm| zEk~rfO8RvILMmWe1lIMO0B$Hdz?sQm2eNp4lZag*X9Tt`TI-eXw{xXP+I|wM#Og%B znnT8hZgz(k*u@wcDnESSdw=qkndAF3LrMM1@v#CIJLhV(nD$k{QQmP2_Iztu6x!BP zTfaTSGc);>`_qv)^MV0h@}QHiVo0oBzfxw9om+4=r97q8Gh*5W1IYVB3&#g47>em>=BJdX?^G?7la<=m}x_ z(mY0Qs@I2@od-j8t`2#H+T~O{?WMkpyKt*5eE0h8bsry_kCVW6Dlf7CWb=Kx;URj#c)|6@MaP*gdncc2k_dU~V zU!dZC`CWND;>8UUmo%abf}(8o8_Cg()!P{BtjjGfvZP?w25Yy$+=^d8w)Mc zYjf#lfA6d9*Kqx;z((0}cRoU4hlx;R;9M4u3`He}hO@XK%t#)t@G*gPa1~8Cu4~gj zeGmF9%y86jRP*nw%v`y}=!upjX?f?vRBweW!O}CA&r+9EJrdN(-tbfJEv#Lk8ksO~ zjc~~NH)835?}$%#?A&1EdZID0#g*K+a)hpU*q-go$+n6u^lISsfzvSe*0`vo76{#DI?_912!++ zn%Q0FsqEez&l(DO7wq|${qnnNR&kQIG_)@%;^=I(@NYTzg^XU9sryk%uW#+QrgqFY zQapzesFRc-Em0XW>UrQoWk| zJ9+i5&-#z@p6eZtZa7=7msp;5$LhT;<54&*M?1JaIZEF1gp~`e&#GE0R=TsH^R316 zy7*;c_klVQGE z^Uasd31M@lCwWV*(iBw;E2?I7cBFQ6ueIZ?- zy~X6`ZJl~QeTj&At%Q4FsU`QMw{bUas@5peZ4S6rbn0uy>FCTR0^2JkX;nswo0?4Q z&P_Ez_w+kE%{b5+V^$Q7deEslQNJsVSzJG_ zQ{4P0!sOSoq!GKFw8CbkWVJHhyR9S7EPiWf3K^dKMLFN)#+uy6H8=B)_2oa9-1koY z^SN)#$!ENRImf`p(3o%Tygke?VR=v0C04@j2o4<7ix}v;9$WGvC!yQfht~g|aC@LxfGp+DNi?AeS)WteB-yoa)g?ZtA;s zzUWAu!?5A=Qo}l3wXP$(`zsos*~YyL3>w;9;ZXFUZ_wO{eq+GNGV<+J8De$+#I}ky zFKx!J|Doo2ja@1Ep-9DrcEV?K^CkV;+gdgkrn9=%%6GrnS3+4Wf8WYYbKLjb2;&sP zbghMYifM(M)YnP%()1FkDz$i@pIr6nqY~*`4icEDgQOAPilD_qqx-`NqSQbh;8IwT z*-Aeri4X<}N#HXhbT`+Z#WP`YdH(PX5h(~8Vc8%8(ndYFA3#W8Tqlx&D*)61WPm3i z93TK(0m#ZuA4A5JPh>NsqB7qxg$xYD>`78x43lI{FN1GNg zlLn{(mH_kts{ob&97iBv!2&jiPeF=`oKU_Go8!Z0a)VfWF!T6a$`mu3V&+IjMszJA zO-+$Fca0$>rJ2U5bp`HcEO;%!xJ06|aNXndz!5V;1fn~N0!?K12AMX~`o{%j=qlQS zz?CO~u#U$O={P2B&~ZGtM#6_6a7;L^7~rBdUyx~lKT9|+Q7qUu#3EcCI5sR`9mn{; z#>ZRlj}jhRlpE3bQs4}akLQoa$7=}ZW*KntynsnaIKB*!MC}0}(}XR5?hnVd3}6bt zF~ONDjA=Sn*cns$bgqQ!9mhN!yRZ+|aX(il0`3L`mU&+HQ*EOEdEWZs4#Z!NqOJ(N zgqn#TqxiNI_aOeHn)N_}8HszCyVvIPDgJDk_4)gJK4*`9@!-VY0JDz9A-!{g6WtQC kZlJ@Q`*PL^LW`k#;O3Lt)7425R}{)Bh0-C1t@2p=FHa@4j{pDw diff --git a/cmds/idmap2/tests/data/overlay/overlay-static-2.apk b/cmds/idmap2/tests/data/overlay/overlay-static-2.apk deleted file mode 100644 index b24765fc666a2c986faa5fac3a712dabb7a16679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3477 zcmds3dpy+X8h>Zp$GB8B*CJ9>j49U9Y?`&mSz&hNl2y}SXrkfFOqMon(MnQnN-MeL zl3dr4P`Xj)bdg=HNoX@!g)S~dB66O0nAGHR{@DHRJfHdgp36J$^FHtMyf=okj4T3D zgx>=6SnHE-%Lxc+fNc&~Kj#MULOB60EG{RI%@>$QYz;|DTv zXt53r4-BGwUF5ToSMb!!)koN2<2qths$?5u6eh>LtRJS_yXCWpfq5mp^leFK#CNZ^j*EhW^9S7onwR=UlE>`L^wUI@>@Dp_6HPHS>|(fZ)0_-=)OgAdPp_hdKx z=6d>U?xN7>SLAK_>?}vecEt-;57!8U3;k%;6K&S7Xk_oS*queAjIOtOtNh%5O<4Z& z{;r;p<7uPcbO)c9b8q2Fw|bGW&Hgv}C)0<7*9F4-nrB_ z=wfFY&6md|&o=PNrR9@)BmJJ0{V{iJTYP0+=lKGT>DaAPw%b_==#iV}W zH!E(|Z?T;-e3h(^7$4Nww19N+4b*m!2z3U|WAiCcS4wC&n-{{0Rx^k)uI<9B>lJgVwlQNFk&abx{n>syS7i#dh6kxblt%-r z9=bPkx{lj&o^NhxEaRs*2r~Rix^6Awrg}BD&oAfBTW{sx8Z%4LD9mEre(Lj0_1i7% zSbJ1sxzxaU2{{TfwYy$=KB;$Fsl`!?ogK@2P{8sH625#o(V_TZvM9*+d=Vrm4mQQ2 z8Ir{e-~2srzYUvuOyZDl+qPdbq64e{bZ9^YW$}Neu5=nYaa+;g>a)Y>d4+V?Rs0>-oUSDbcyB^<0(F zt&)qy4Udlb5A)lM4n{Q|YcPsGmvzymceTgOaC)I$a6{@2W$!~aZuCBz8@ka79gQ75 zR&C$?^RbSZ&%z@qDVLYj6`oqUWaZQ)2u!-ybZZ65MZIoT`*6PT6+Wx$V4kTk zU)`DJ%i)G_xKoonPpY**HG?X1^E*VDB2iJ5O%;jM+aULasl76F?tQ&+#R(5eqTeiq zpY^=V|FfaP=*ky}Xmp=&H7v98s=@}|TGt!e)rQRhdF6+{^f(fgD zM&G$^)KOKC>p7CtQ{MO}KiPe5oZ*qDb~<}lX@&dG(5w&lJMLOsHtgwWJ8#EZwbxdq z$LCcv-;6N-vpQkOZVSDvSuItwn*VhDP>a=AqcCJ};+}em+nG;`?%X^Y@KywN|t zq2_^)p2wfBY>RzfpR7DxuHi;M#Qdr`&G^EG*00L4*d>Z|pif>7e;-beqz3W; z_rjRjobAbS2w|vBrY3Y7&!5dVXYu&{L_`+1z?wk>q=%m2P5?21@iU1GoD9$cPypV5 za6ls9BtS`N>I^cYz9+9h8X7a5QE1U3Y4gmx5$WoF^vCICjI^~sYLyfkk;(5OGUJE8 zr&?ka5e*2La8rH{u?r9z@!@NZLSas9#6uy7g(5-6Ru+JR{Lymw=l>@e;Nk-brZ|@I zT382M1}jr!A`yVk1{eYqAU9lb27|_On_6F^wU<4ANIlOE_e9$X{wLl8J79M>-3lD17C(*b{%a9omDuy2S(ygYDhSim}t z@qdkvx87eRJhmh^lJVui86F?cACHgM5YCMOaOu2&NlZAt9FQdK0U*=GEr0KWV>19) z0B}rj;EH3KiWPRoq&}4^@p{KGPsJ|ogLT}G;Y`5YfWR`t>wdCL@}1$WFYQ43=_u)n zP$$$(`WVGmrL+g>_tdn9Sui7M4Px# diff --git a/cmds/idmap2/tests/data/overlay/overlay.apk b/cmds/idmap2/tests/data/overlay/overlay.apk index 870575efa10ccbb92506845b77c9816dd9695d5f..c7ea623f64f275e710efb301fcb47bc413f944c1 100644 GIT binary patch literal 4952 zcmd^Dc{r478-K<+7+E4?O^Zs4NK#pvBU?C8mNQX}*)WzFW`>esXA?JCAiH7gGzP^9I=emCHec#V=zt6oq%lo=Gic0`k&;Ueb zqZoym1z}$oR217ugIwEle%VI@z9ezQkptBy4m0v%D^uxF7k%o4ZM2F zahm;|s85!8kq0}{weR+ZJeHi7YN%uQ=vixeVqW#&!|-r(>h*37+Ta4#<>IXsPi3R# z_LoF2Om@moS$1izd3N4qc2IZ!-I*6R+j)?T4_t{~)zh%;_j-%?ozYb(QYA9ae4AJX zX1_R7&IhDurZH-J$|I7hz;{$r%*-u7qd_xtZB-|~Olb60z?>qEzBUZLOaBwpxXQDMIisknln*X@}c zvAcM!mPwc4jMx)hrR$%*yplE$c+I|>H*C6+@Ze^w{{G;h5NFEhnQQWc?}j+>Up!il zWnWUf6`@u(Kfv=S*@^eZ{DfoP`T+6M z_;}B}Dv5*;e3&c#qndYte^RgV(k-#nb+@wAulzWv1+jjtAarYZkk?rwjyOxq8jiZTYi|X&hTlT&7 zd)QpcI&QRPKRXElevh)3;(^V8=V@@4a=k`xlQQ=%qLm01Kw^7J)+Z@u4!Q zbT%QFNDd(SQU(5VHk0MxR5C}N@4pmBBF<@VkB{rrud$BTllaYQtGI{fu7Ipsuj_|6 zTVfh#4ETh}Z>~|vxfms_xE>djvRs*IWpL9ZT(_vG#%#_8gQ9@m&g7-Pe>t=Em}c@D zUQq1nk2bDrQx^FreCe(lb<^)a6)`WYX1!nLZQ)~%%IaCfK=hqSNy}|Jnp6lwNp_$NN&FKuL(F1Ap zaVvk9vv)pPuJ8$n~m6Ci=kz0@X0WB-F{}^?y5SVW~GVSzov!;)NtawZ2n5ECPh|4 zb)z|{^7xJ>>F${W(Vw})-eNUhWyu-pj;8$84VKH=-l6v8kf=vX`rhxeapNY0%8pn@ zZn}7^T!NRE(m~47i(Rx4zlqaDE&Dlsc#W5hd*z?x$|bJY87Jl9ySjgkUFT;`59=t! z_bE$Vd(yi@E|a)|_F&<~$e%*bC7YU`JlN}(-R)Q--{BKd?Vyf-V7a}2bFFWG=Sgt4 z0`-`0UORlRwh?WqGq}1qJm=G<5|n4&{S5Ms7?#5Re>5z5@6fm#UqyZO=WoyTE_sC2 z$40LBB9?bcecr*R`dIB1YsKoHVw_1svN4V^OAG_=yw&64>t3Wat6~j&6ZLF!yxS@5 zV)f4xaU>@dOf1IE8=q;Eip||eOe4x-vW%?`8o3)TU9og8F_`N{YEs2yVYYb#-zGh7 z#XjO8A{vuq{3xO|@}JReh416KNB0ft1&n7D-15|?iz{mfF<7u}Q=J1iIK_r1J_B}f zl7%{ppFh~HXCF~Uz`gyOoKdeVwrVe1^KJfYZvR8eSJrvfH(p!n7-I%Hh$d3)W>HoL z#A}_bQ2kZb))uZT{|!aw6nYP5+{O z9_zwqcH|?kfC9FQGkrh__?#pXcBJ> zR8*!rm%xGrqSe!Hz(7-TO2>(f3utRkX`Q^Zfx7yXc43MD4CdR6m$AYoi7OEiI!hOY zgEzomAUS$Uv$LF&9D_ z&;VWFL0^IA0FV;+k}0V7g+0Wy#m^a26ZBLrY6^h@hSj zMx|4rIT8{qHq&T~7>|*a-`0LO3utJJ4`)qX#6UseTjSWm1xiZaYJ`h*!m%s@vOr<{ z#KaT<7E%}{xNl7ql$aaXJ*j>x6ad|v8f>*RzI0IFd~p_)mTOBY8;BnjXNEe-nMvUEdI2mA}(*2m`n delta 1915 zcmZ8i30M5jMjRg%sQa?}vRzXS>V62hr0^vd?jPCXn?^?C?KjbAru}3m4-YAs zy4hiPuJJnQ(qdF#U=!-aGTJ1Xl^S1^Ue{(h=b%ICYP0y*9U67V)pQT51Yf=_Ou3vf zv^o5WdWSSRDqv-HSl@vODl6##xDTFx3B!Hvi4A0fZ7ez?OS zk)$qFw|@L0!}H1rP4D4rXnV=xEg-KMnxK1;={(aj0hR$4(S6NlUBc!)u+}5l_uVd9 zZ&aE;M|SEk%TCdf--fS_q6}2Felbg5|(+UqT1@?tPP*gFD0)qA22@G6~m(#v9@v#O-c%{%KJ|)xaQQ% zaZh{t^8kxDR1&qvyXYZhe3UUpf1&m64ek_Z3Rr@HO^=n8iO2lJr=lt}cU^^rVag|V zRYKdf%;>Ik6P)8Vw~+mefymaM+`i>!kTQjgSliq)2AJl(BcZQa1H32#<4n^`QBN6v zecZ#5*B|?Ex|*N;U(wT{_4Sv4mJJHu8ScfJ!+}H-cox=JA}9_I$9;3vp?D{O{!0`- zb-8^7%4L3IP0-W%Q31WKis-E5h4uRLHWE1D&6sTaqU|><@SaX#&oh_gcZBvZ1M=CL zu4{6~yA@64?Jo{Tk0*9J9!yalZg+SDfwp8L^c~62)P{zh2pjIRcdYV=iPNn zzgAyik;%Ksaq=I>l!T?D_(j8{vB-wFStH|;?WpM^K=Nr1O$nH)qk0g8fCPm>kSHcG zK1mcElemB{N{mKBM!G4GY6u0{KyN-(0q8*k#wDLdy50!%6aYFvIKXy*e1Ovs1b>U) zfwr`S2TU#DQ9M--O+^)9tE>nj)c11Wfd|kv!07vVhzJ7!3jjL+CjeJ~MF1fHu>e@C zKqzKFM4~WW%o7NCV!kLYMhx2#IdB@W3~vKm&;S^iPckF!oz{Sigi}duc!ETorF$`S z2sCr{FXLq}hk%8tWGsUW{K3~=#{?us|Fe$#1`r+DBpOYIs6b)>u<%lXnF$JTo|(1) z`2$!nI0E4T2d#@kc82Jm`7lTpZ8sArySm#1ZkCae=3&bM-cOlEKep5XfB>bh$K w;`V~IENAfG^>jfWOlSE4o|!fFf5*Atoverlay-3 -1 -1 + + + overlaid + overlaid + overlaid + + + overlaid + overlaid + overlaid + overlaid + overlaid + overlaid + + + overlaid + + + overlaid diff --git a/cmds/idmap2/tests/data/overlay/res/xml/overlays_policies.xml b/cmds/idmap2/tests/data/overlay/res/xml/overlays_policies.xml new file mode 100644 index 0000000000000..747f448d46fdb --- /dev/null +++ b/cmds/idmap2/tests/data/overlay/res/xml/overlays_policies.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cmds/idmap2/tests/data/signature-overlay/AndroidManifest.xml b/cmds/idmap2/tests/data/signature-overlay/AndroidManifest.xml deleted file mode 100644 index 5df0bea555b16..0000000000000 --- a/cmds/idmap2/tests/data/signature-overlay/AndroidManifest.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - diff --git a/cmds/idmap2/tests/data/signature-overlay/build b/cmds/idmap2/tests/data/signature-overlay/build deleted file mode 100755 index fdd8301c3b7dd..0000000000000 --- a/cmds/idmap2/tests/data/signature-overlay/build +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2019 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FRAMEWORK_RES_APK=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar - -aapt2 compile --dir res -o compiled.flata - -aapt2 link \ - --no-resource-removal \ - -I "$FRAMEWORK_RES_APK" \ - --manifest AndroidManifest.xml \ - -o signature-overlay.apk \ - compiled.flata - -rm compiled.flata diff --git a/cmds/idmap2/tests/data/signature-overlay/res/values/values.xml b/cmds/idmap2/tests/data/signature-overlay/res/values/values.xml deleted file mode 100644 index 59e7d8ed69c18..0000000000000 --- a/cmds/idmap2/tests/data/signature-overlay/res/values/values.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - policy_signature - diff --git a/cmds/idmap2/tests/data/signature-overlay/signature-overlay.apk b/cmds/idmap2/tests/data/signature-overlay/signature-overlay.apk deleted file mode 100644 index e0fd20499671e350961a887e3195bbe89181d7d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1299 zcmWIWW@cdk0uCTjWa#M2W_-xVz%TcMIrLhK>_~pW=m>A&u5;!$Nc@E@dvS#2SPQh z_Yd%I5L_a6;vnk}7Q5#64;pUuA5;r%k9xUMOzO34q~_LXR>`^VW3qSTK2v-xtW>o3 zh+O8O-$#tC>MPO{opY#s*;~2SO<&h_t+~(m(%GZ5ztUUr%YoPrdqfY- zF5~dtz{C~%#WVK9w^ZN0>e{!Qui;NRIx5?-qq8#`yXvj-W#?yZbjzn zDYl*e_hjDgjtN>b*IW7es?3c$uUxugocU$no5CHBX8&OdfTjpgqEKY;&fM|Pfr)_u zg!vel7>ZJh^Gl18Q;YQyi;9yOfFe9#Ibfn;U}TVCFags*0tA493Sb6=5D+NH&&f=# zj4#ei&r2*RElLH7Gbu0v4PmGUGD{dz8H$0V9z#Au8IWDXki(G3PzmH014)ofDnl-k zdBcqf3<)p@fYKliC`=8&G*}8uC?J>&Y~XMyV#s93V@L;zlM@F_OacrdV7=fd1Dnps z6vB{!Bo+Z=JAh> - - - - - diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/build b/cmds/idmap2/tests/data/system-overlay-invalid/build deleted file mode 100755 index 920e1f8ad6f32..0000000000000 --- a/cmds/idmap2/tests/data/system-overlay-invalid/build +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2019 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FRAMEWORK_RES_APK=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar - -aapt2 compile --dir res -o compiled.flata - -aapt2 link \ - --no-resource-removal \ - -I "$FRAMEWORK_RES_APK" \ - --manifest AndroidManifest.xml \ - -o system-overlay-invalid.apk \ - compiled.flata - -rm compiled.flata diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml b/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml deleted file mode 100644 index ebaf49c347621..0000000000000 --- a/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - policy_system - policy_system_vendor - policy_public - - - policy_product - policy_signature - policy_odm - policy_oem - policy_actor - policy_config_signature - - - not_overlayable - - - other - diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk b/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk deleted file mode 100644 index a63daf86caf58b9e1ddc414ac9832239707ea404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1907 zcmWIWW@cdk0uCTjWO(`KbMP)k1_lqHm@rV(F)yVkKQqNQF)uSMwYWsDA~$F1VQV`@wYxVL_a?qS|ra4{U)X!aC zXBm2lUM}7C->&}ua{vFv(i&H;HKc4=@Vm)m*uU=i2bhY%*yGd0Bo#!IHZgGzZZoY3kUH0d+yQ+DXb(3NZ3*E)D z4#_OIc0n+(=@+Zz>%4dTyMOuJiofOd``mTK)q2a{?Y6w88fq$jyE-+ppmnxmobiG%6^rh(x;qtVn$2%7WXKc3m>bG`% zMEJWp-=gb%FP~Idy^e`$U;f4~;O2w8ZO&igt3J=4^+opV=HHjYrxc4GjN9Gw*2yJx zcFonV?>0}*O#SxP+g$Al_tax4XM}D@8mMVXU1l{(t?^3zaL)LM4G-6ca>;vk%14ZQ z7X4rMcHe>L&fD~=`u4ZnW)>Hzt?Q{gR4hDC`)O9L&AioH?XJyOZfxiD{%}f-#??*r z=B)qXep;>G{`OUH-Idp(Mpeh|-~FZWy_$*5)_jJg@_NxHRkz;H{kinId;m16L9wmK z(C#M0aRM04Ak4?W$WWA8oL^d$oLa1xSX7+Mz{J1-5EaOBi^0VFIN|K(iSH1fYC`X>cXQmBl4MGeksSO2GX1vedj3pmP|Q6d3m~GceQx z{ZPV?%1{g>^%(LQ%7E-5h8%`OhDsp67)XL-QWpu3fS6Js05m`Wh(Yn_0K}j?oB+fHK->Vt6M%RD5CiK8FaXlP90B2j+ydf5 zX<*p_;X`S#LXbR214uux!~v^^(hRInK9mNg7l=HRW?+Z%p)}YGka-}pK$sIM52YEn zpnMP=;LQkf1`q&MVyWREaxfB0eTOgrWCnV<3DXFoUjzM*T8ajEvx58p3=k%US|I%Z G%mV=H7q315 diff --git a/cmds/idmap2/tests/data/system-overlay/build b/cmds/idmap2/tests/data/system-overlay/build deleted file mode 100755 index be0d2390f535f..0000000000000 --- a/cmds/idmap2/tests/data/system-overlay/build +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2019 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FRAMEWORK_RES_APK=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar - -aapt2 compile --dir res -o compiled.flata - -aapt2 link \ - --no-resource-removal \ - -I "$FRAMEWORK_RES_APK" \ - --manifest AndroidManifest.xml \ - -o system-overlay.apk \ - compiled.flata - -rm compiled.flata diff --git a/cmds/idmap2/tests/data/system-overlay/res/values/values.xml b/cmds/idmap2/tests/data/system-overlay/res/values/values.xml deleted file mode 100644 index 6aaa0b02639ed..0000000000000 --- a/cmds/idmap2/tests/data/system-overlay/res/values/values.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - policy_system - policy_system_vendor - policy_public - diff --git a/cmds/idmap2/tests/data/system-overlay/system-overlay.apk b/cmds/idmap2/tests/data/system-overlay/system-overlay.apk deleted file mode 100644 index 90d2803a1ecaa4511018fc382c6c5aedff4332ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1387 zcmWIWW@cdk0uCTjWZ+$x=CX;Afx!YOCJYpH%u6ZC&rI=6%*#wmEiTck$jzBL`MjR9 zqr}nkUslEak9P5hxDmBwTGGj5i(I_cc&_$Xy?v){=iJuTrR^I&vB(`Xu3+=7t}|Zt zu5>A9d6CuqIqzp1r|+wl*0^%4BW25)_BkOzpJbLlirm0g=D=>#r2c^^?x6Jwsc#Ju zcN)__u!&vJeG#MnDl>Ybl-1HIui61%%7QeU_F==+(c`~IJJCm3(F&n495&ehgi z2J9=gmbi#4u5&!MEBcr7)dQZ-qi?TxRwKLVRbkfIvlG|d2rb{Z_c*7ul!2fX?+nfv zdW+BQ^1JiDY~!)HzkAl1g(iMEF@JIKORKLX&Q|pDDmtRP{`o(YU zdXMYx>T-+B`(CD1?RpUt)$Y40Ib_?8*>3}qJ@Wr;R(F1xVOPO*CRu^Ke*UAk#(p;EPyBv=;~J}- ze9*2(mj9U6vFV-o{YT|<&+{}J^QkwpAHO^k_d5CTSH+KlRq|?2oja%ft=9bT{nWe7 zRiWGMAFA(((_5PU=kD76M+?*wt`sj`X}l@QaoO_bdovaH{$mM%MlmRs6&cE&e33uF z#J~W;d<={XMXAO4rA5i9#d?WF#mNjz3_M^dU?KoY$}l7VX=We>1E8P=j18m(fLH;D zd3g)+b25`F;|ofYfHZ<%Tv=R_n#&*}0+omGQu2#{8krOrV}Q=62Qo_-QW=VY zq#i>)Lm7}=#E`>~$WRI77XwL8EAf*W)8w41cLKr51Xdniqmjobo0Afl3ER6xnCollg z;N%G6gX{wFp)@e LoadedIdmap::Load(const StringPiece& idmap_pa if (!target_path) { return {}; } - if (!ReadString(&data_ptr, &data_size, "debug info")) { + if (!ReadString(&data_ptr, &data_size, "target name") || + !ReadString(&data_ptr, &data_size, "debug info")) { return {}; } diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h index d1622a03a318c..bfd564c258ee7 100644 --- a/libs/androidfw/include/androidfw/ResourceTypes.h +++ b/libs/androidfw/include/androidfw/ResourceTypes.h @@ -44,7 +44,7 @@ namespace android { constexpr const static uint32_t kIdmapMagic = 0x504D4449u; -constexpr const static uint32_t kIdmapCurrentVersion = 0x00000006u; +constexpr const static uint32_t kIdmapCurrentVersion = 0x00000007u; /** * In C++11, char16_t is defined as *at least* 16 bits. We do a lot of diff --git a/libs/androidfw/tests/data/app/app.apk b/libs/androidfw/tests/data/app/app.apk index c8ad86ded8519b81b604adf03a37489b422356a3..67036959d1857c5565782a96ea6e84a75b17bee5 100644 GIT binary patch delta 7972 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 delta 392 zcmdns_KQm*z?+$cfq?@E85-s@GQhz^iBlQu92E;sw5$h;l>lWRD!~eXD!-guRe6Pp zfdPd1fPzJ-#rdU0$*IM9iABZ9Obk3=8IXaD3^G871b~8YK9d6D8m7&Ba(s;S2}rhs z^f&;u01bx&6*!9lXgUJ}3qvA92@nEau}K9SXbV}K45052p2&;S4c delta 17 YcmZo*{lmiQ>Eau}Hj&kTV}u4104_EJ(*OVf