From 0699f1de6a684644b2debf82d55dfbcbc9387679 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 3 Dec 2020 15:41:42 -0800 Subject: Remove idmap path 256 length limit Overlay and target package paths can be longer than 256 characters. Currently, the idmap will fail to be generated if either path is longer than 256 characters. This change removes the 256 character limit and makes parsing variable length strings easier in libandroidfw. Bug: 174676094 Test: idmap2_tests && libandroidfw_tests Change-Id: Ic240cdb8700566b2ac2ade08da58bea852e4ae0c --- libs/androidfw/Idmap.cpp | 250 ++++++++++++++++++++++++++--------------------- 1 file changed, 139 insertions(+), 111 deletions(-) (limited to 'libs/androidfw/Idmap.cpp') diff --git a/libs/androidfw/Idmap.cpp b/libs/androidfw/Idmap.cpp index a61309514143..68844be6d14a 100644 --- a/libs/androidfw/Idmap.cpp +++ b/libs/androidfw/Idmap.cpp @@ -36,13 +36,51 @@ using ::android::base::StringPrintf; namespace android { -uint32_t round_to_4_bytes(uint32_t size) { - return size + (4U - (size % 4U)) % 4U; -} +// See frameworks/base/cmds/idmap2/include/idmap2/Idmap.h for full idmap file format specification. +struct Idmap_header { + // Always 0x504D4449 ('IDMP') + uint32_t magic; + uint32_t version; -size_t Idmap_header::Size() const { - return sizeof(Idmap_header) + sizeof(uint8_t) * round_to_4_bytes(dtohl(debug_info_size)); -} + uint32_t target_crc32; + uint32_t overlay_crc32; + + uint32_t fulfilled_policies; + uint32_t enforce_overlayable; + + // overlay_path, target_path, and other string values encoded in the idmap header and read and + // stored in separate structures. This allows the idmap header data to be casted to this struct + // without having to read/store each header entry separately. +}; + +struct Idmap_data_header { + uint8_t target_package_id; + uint8_t overlay_package_id; + + // Padding to ensure 4 byte alignment for target_entry_count + uint16_t p0; + + uint32_t target_entry_count; + uint32_t target_inline_entry_count; + uint32_t overlay_entry_count; + + uint32_t string_pool_index_offset; +}; + +struct Idmap_target_entry { + uint32_t target_id; + uint32_t overlay_id; +}; + +struct Idmap_target_entry_inline { + uint32_t target_id; + Res_value value; +}; + +struct Idmap_overlay_entry { + uint32_t overlay_id; + uint32_t target_id; +}; OverlayStringPool::OverlayStringPool(const LoadedIdmap* loaded_idmap) : data_header_(loaded_idmap->data_header_), @@ -155,140 +193,132 @@ IdmapResMap::Result IdmapResMap::Lookup(uint32_t target_res_id) const { return {}; } -static bool is_word_aligned(const void* data) { - return (reinterpret_cast(data) & 0x03U) == 0U; -} - -static bool IsValidIdmapHeader(const StringPiece& data) { - if (!is_word_aligned(data.data())) { - LOG(ERROR) << "Idmap header is not word aligned."; - return false; +namespace { +template +const T* ReadType(const uint8_t** in_out_data_ptr, size_t* in_out_size, const std::string& label, + size_t count = 1) { + if (!util::IsFourByteAligned(*in_out_data_ptr)) { + LOG(ERROR) << "Idmap " << label << " is not word aligned."; + return {}; } - - if (data.size() < sizeof(Idmap_header)) { - LOG(ERROR) << "Idmap header is too small."; - return false; + if ((*in_out_size / sizeof(T)) < count) { + LOG(ERROR) << "Idmap too small for the number of " << label << " entries (" + << count << ")."; + return nullptr; } + auto data_ptr = *in_out_data_ptr; + const size_t read_size = sizeof(T) * count; + *in_out_data_ptr += read_size; + *in_out_size -= read_size; + return reinterpret_cast(data_ptr); +} - auto header = reinterpret_cast(data.data()); - if (dtohl(header->magic) != kIdmapMagic) { - LOG(ERROR) << StringPrintf("Invalid Idmap file: bad magic value (was 0x%08x, expected 0x%08x)", - dtohl(header->magic), kIdmapMagic); - return false; +std::optional ReadString(const uint8_t** in_out_data_ptr, size_t* in_out_size, + const std::string& label) { + const auto* len = ReadType(in_out_data_ptr, in_out_size, label + " length"); + if (len == nullptr) { + return {}; } - - if (dtohl(header->version) != kIdmapCurrentVersion) { - // We are strict about versions because files with this format are auto-generated and don't need - // backwards compatibility. - LOG(ERROR) << StringPrintf("Version mismatch in Idmap (was 0x%08x, expected 0x%08x)", - dtohl(header->version), kIdmapCurrentVersion); - return false; + const auto* data = ReadType(in_out_data_ptr, in_out_size, label, *len); + if (data == nullptr) { + return {}; } - - return true; + // Strings are padded to the next 4 byte boundary. + const uint32_t padding_size = (4U - ((size_t)*in_out_data_ptr & 0x3U)) % 4U; + for (uint32_t i = 0; i < padding_size; i++) { + if (**in_out_data_ptr != 0) { + LOG(ERROR) << " Idmap padding of " << label << " is non-zero."; + return {}; + } + *in_out_data_ptr += sizeof(uint8_t); + *in_out_size -= sizeof(uint8_t); + } + return std::string_view(data, *len); +} } LoadedIdmap::LoadedIdmap(std::string&& idmap_path, - const time_t last_mod_time, const Idmap_header* header, const Idmap_data_header* data_header, const Idmap_target_entry* target_entries, const Idmap_target_entry_inline* target_inline_entries, const Idmap_overlay_entry* overlay_entries, - ResStringPool* string_pool) + std::unique_ptr&& string_pool, + std::string_view overlay_apk_path, + std::string_view target_apk_path) : header_(header), data_header_(data_header), target_entries_(target_entries), target_inline_entries_(target_inline_entries), overlay_entries_(overlay_entries), - string_pool_(string_pool), + string_pool_(std::move(string_pool)), idmap_path_(std::move(idmap_path)), - idmap_last_mod_time_(last_mod_time) { - - size_t length = strnlen(reinterpret_cast(header_->overlay_path), - arraysize(header_->overlay_path)); - overlay_apk_path_.assign(reinterpret_cast(header_->overlay_path), length); - - length = strnlen(reinterpret_cast(header_->target_path), - arraysize(header_->target_path)); - target_apk_path_.assign(reinterpret_cast(header_->target_path), length); -} + overlay_apk_path_(overlay_apk_path), + target_apk_path_(target_apk_path), + idmap_last_mod_time_(getFileModDate(idmap_path_.data())) {} std::unique_ptr LoadedIdmap::Load(const StringPiece& idmap_path, const StringPiece& idmap_data) { ATRACE_CALL(); - if (!IsValidIdmapHeader(idmap_data)) { + size_t data_size = idmap_data.size(); + auto data_ptr = reinterpret_cast(idmap_data.data()); + + // Parse the idmap header + auto header = ReadType(&data_ptr, &data_size, "header"); + if (header == nullptr) { return {}; } - - auto header = reinterpret_cast(idmap_data.data()); - const uint8_t* data_ptr = reinterpret_cast(idmap_data.data()) + header->Size(); - size_t data_size = idmap_data.size() - header->Size(); - - // Currently idmap2 can only generate one data block. - auto data_header = reinterpret_cast(data_ptr); - data_ptr += sizeof(*data_header); - data_size -= sizeof(*data_header); - - // Make sure there is enough space for the target entries declared in the header - const auto target_entries = reinterpret_cast(data_ptr); - if (data_size / sizeof(Idmap_target_entry) < - static_cast(dtohl(data_header->target_entry_count))) { - LOG(ERROR) << StringPrintf("Idmap too small for the number of target entries (%d)", - (int)dtohl(data_header->target_entry_count)); + if (dtohl(header->magic) != kIdmapMagic) { + LOG(ERROR) << StringPrintf("Invalid Idmap file: bad magic value (was 0x%08x, expected 0x%08x)", + dtohl(header->magic), kIdmapMagic); return {}; } - - // Advance the data pointer past the target entries. - const size_t target_entry_size_bytes = - (dtohl(data_header->target_entry_count) * sizeof(Idmap_target_entry)); - data_ptr += target_entry_size_bytes; - data_size -= target_entry_size_bytes; - - // Make sure there is enough space for the target entries declared in the header. - const auto target_inline_entries = reinterpret_cast(data_ptr); - if (data_size / sizeof(Idmap_target_entry_inline) < - static_cast(dtohl(data_header->target_inline_entry_count))) { - LOG(ERROR) << StringPrintf("Idmap too small for the number of target inline entries (%d)", - (int)dtohl(data_header->target_inline_entry_count)); + if (dtohl(header->version) != kIdmapCurrentVersion) { + // We are strict about versions because files with this format are generated at runtime and + // don't need backwards compatibility. + LOG(ERROR) << StringPrintf("Version mismatch in Idmap (was 0x%08x, expected 0x%08x)", + dtohl(header->version), kIdmapCurrentVersion); return {}; } - - // Advance the data pointer past the target entries. - const size_t target_inline_entry_size_bytes = - (dtohl(data_header->target_inline_entry_count) * sizeof(Idmap_target_entry_inline)); - data_ptr += target_inline_entry_size_bytes; - data_size -= target_inline_entry_size_bytes; - - // Make sure there is enough space for the overlay entries declared in the header. - const auto overlay_entries = reinterpret_cast(data_ptr); - if (data_size / sizeof(Idmap_overlay_entry) < - static_cast(dtohl(data_header->overlay_entry_count))) { - LOG(ERROR) << StringPrintf("Idmap too small for the number of overlay entries (%d)", - (int)dtohl(data_header->overlay_entry_count)); + std::optional overlay_path = ReadString(&data_ptr, &data_size, "overlay path"); + if (!overlay_path) { return {}; } - - // Advance the data pointer past the overlay entries. - const size_t overlay_entry_size_bytes = - (dtohl(data_header->overlay_entry_count) * sizeof(Idmap_overlay_entry)); - data_ptr += overlay_entry_size_bytes; - data_size -= overlay_entry_size_bytes; - - // Read the idmap string pool that holds the value of inline string entries. - uint32_t string_pool_size = dtohl(*reinterpret_cast(data_ptr)); - data_ptr += sizeof(uint32_t); - data_size -= sizeof(uint32_t); - - if (data_size < string_pool_size) { - LOG(ERROR) << StringPrintf("Idmap too small for string pool (length %d)", - (int)string_pool_size); + std::optional target_path = ReadString(&data_ptr, &data_size, "target path"); + if (!target_path) { + return {}; + } + if (!ReadString(&data_ptr, &data_size, "debug info")) { return {}; } + // Parse the idmap data blocks. Currently idmap2 can only generate one data block. + auto data_header = ReadType(&data_ptr, &data_size, "data header"); + if (data_header == nullptr) { + return {}; + } + auto target_entries = ReadType(&data_ptr, &data_size, "target", + dtohl(data_header->target_entry_count)); + if (target_entries == nullptr) { + return {}; + } + auto target_inline_entries = ReadType( + &data_ptr, &data_size, "target inline", dtohl(data_header->target_inline_entry_count)); + if (target_inline_entries == nullptr) { + return {}; + } + auto overlay_entries = ReadType(&data_ptr, &data_size, "target inline", + dtohl(data_header->overlay_entry_count)); + if (overlay_entries == nullptr) { + return {}; + } + std::optional string_pool = ReadString(&data_ptr, &data_size, "string pool"); + if (!string_pool) { + return {}; + } auto idmap_string_pool = util::make_unique(); - if (string_pool_size > 0) { - status_t err = idmap_string_pool->setTo(data_ptr, string_pool_size); + if (!string_pool->empty()) { + const status_t err = idmap_string_pool->setTo(string_pool->data(), string_pool->size()); if (err != NO_ERROR) { LOG(ERROR) << "idmap string pool corrupt."; return {}; @@ -296,12 +326,10 @@ std::unique_ptr LoadedIdmap::Load(const StringPiece& idmap_pa } // Can't use make_unique because LoadedIdmap constructor is private. - auto loaded_idmap = std::unique_ptr( - new LoadedIdmap(idmap_path.to_string(), getFileModDate(idmap_path.data()), header, - data_header, target_entries, target_inline_entries, overlay_entries, - idmap_string_pool.release())); - - return std::move(loaded_idmap); + return std::unique_ptr( + new LoadedIdmap(idmap_path.to_string(), header, data_header, target_entries, + target_inline_entries, overlay_entries, std::move(idmap_string_pool), + *target_path, *overlay_path)); } bool LoadedIdmap::IsUpToDate() const { -- cgit v1.2.3-59-g8ed1b From 30dc2e01714a50e3816efa3bd347d1bf783fa0a5 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Wed, 2 Dec 2020 11:43:18 -0800 Subject: 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 +++----- cmds/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 | 200 +++++++----------- cmds/idmap2/tests/TestConstants.h | 7 +- cmds/idmap2/tests/TestHelpers.h | 73 ++++--- cmds/idmap2/tests/data/overlay/AndroidManifest.xml | 39 +++- .../tests/data/overlay/AndroidManifestLegacy.xml | 21 ++ .../tests/data/overlay/AndroidManifestNoName.xml | 21 -- .../data/overlay/AndroidManifestNoNameStatic.xml | 24 --- .../tests/data/overlay/AndroidManifestStatic1.xml | 24 --- .../tests/data/overlay/AndroidManifestStatic2.xml | 24 --- cmds/idmap2/tests/data/overlay/build | 31 +-- cmds/idmap2/tests/data/overlay/overlay-legacy.apk | Bin 0 -> 4708 bytes .../tests/data/overlay/overlay-no-name-static.apk | Bin 3485 -> 0 bytes cmds/idmap2/tests/data/overlay/overlay-no-name.apk | Bin 3393 -> 0 bytes cmds/idmap2/tests/data/overlay/overlay-shared.apk | Bin 3757 -> 5216 bytes .../idmap2/tests/data/overlay/overlay-static-1.apk | Bin 3477 -> 0 bytes .../idmap2/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 ++ .../data/overlay/res/xml/overlays_policies.xml | 33 +++ .../data/signature-overlay/AndroidManifest.xml | 25 --- cmds/idmap2/tests/data/signature-overlay/build | 26 --- .../data/signature-overlay/res/values/values.xml | 20 -- .../data/signature-overlay/signature-overlay.apk | Bin 1299 -> 0 bytes .../system-overlay-invalid/AndroidManifest.xml | 23 -- .../idmap2/tests/data/system-overlay-invalid/build | 26 --- .../system-overlay-invalid/res/values/values.xml | 37 ---- .../system-overlay-invalid.apk | Bin 1907 -> 0 bytes .../tests/data/system-overlay/AndroidManifest.xml | 23 -- cmds/idmap2/tests/data/system-overlay/build | 26 --- .../data/system-overlay/res/values/values.xml | 22 -- .../tests/data/system-overlay/system-overlay.apk | Bin 1387 -> 0 bytes libs/androidfw/Idmap.cpp | 3 +- libs/androidfw/include/androidfw/ResourceTypes.h | 2 +- libs/androidfw/tests/data/app/app.apk | Bin 1402 -> 9008 bytes libs/androidfw/tests/data/overlay/overlay.idmap | Bin 636 -> 640 bytes 54 files changed, 567 insertions(+), 787 deletions(-) create mode 100644 cmds/idmap2/tests/data/overlay/AndroidManifestLegacy.xml 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 100644 cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml 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 (limited to 'libs/androidfw/Idmap.cpp') diff --git a/cmds/idmap2/idmap2/CommandUtils.cpp b/cmds/idmap2/idmap2/CommandUtils.cpp index 45f37962331b..09867f3a9c20 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 e717e046d15d..e06896784d6a 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 648b78e24c23..c93c717a15d2 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 19622c4ef65a..5db391caac30 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 64e49307c0df..43a1951a5ba9 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 8a7272c073b9..93537d32299b 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 3163e40a7bff..1b815c1197ca 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 c643b0e8800c..cd14d3e7254c 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 5db09baca5d5..c16310792d12 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 4745cc6cdc33..5af84b0c6e4e 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 f56d3d21e25b..7e090a983f95 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 d7f073944542..b517aa3a0c01 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 e817140238ae..52837418e775 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()); - } - - 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; - } else { - return Error("android:resourcesMap is not a reference in AndroidManifest.xml of %s", - path.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_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; + if (auto result_str = it.GetAttributeStringValue("targetPackage")) { + info.target_package = *result_str; } else { - return Error("android:isStatic is not a boolean 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("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_str = it.GetAttributeStringValue("targetName")) { + info.target_name = *result_str; } - } - if (auto result_str = overlay_it->GetAttributeStringValue("requiredSystemPropertyName")) { - info.requiredSystemPropertyName = *result_str; - } - - if (auto result_str = overlay_it->GetAttributeStringValue("requiredSystemPropertyValue")) { - info.requiredSystemPropertyValue = *result_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; } - 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 c3a3e0ba9047..524aabcec652 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 e7e9e4cf5091..a55b41b83c93 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 7be1602ccf40..c13b049eadfe 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 d30fbfcb1d3c..87ce0f13d19e 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 854b57fb22aa..ac9b0580d2d9 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; - } -} - -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; + 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::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 b7ea22aa4a2e..88f85efb0f84 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 185e9292346d..0362529c4f3b 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,27 @@ 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); + 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::system_overlay::string::policy_public, false /* rewrite */)); + R::overlay::string::policy_public, true /* rewrite */)); ASSERT_RESULT(MappingExists(res, R::target::string::policy_system, - R::system_overlay::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::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", - "/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 +218,19 @@ 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 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 69575b8f9c01..d5799adf0ec3 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 5c934a33ebb6..842af3dd7b3c 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 cf3691c3b3cf..2c50dee05b11 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/overlay/AndroidManifestLegacy.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestLegacy.xml new file mode 100644 index 000000000000..9fc2105fe827 --- /dev/null +++ b/cmds/idmap2/tests/data/overlay/AndroidManifestLegacy.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml b/cmds/idmap2/tests/data/overlay/AndroidManifestNoName.xml deleted file mode 100644 index bc6b733e849f..000000000000 --- 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 ed327ce0e630..000000000000 --- 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 1c4dae6cf69c..000000000000 --- 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 70efc8603670..000000000000 --- 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 114b099598fa..1f1cedb05271 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 \ + --manifest AndroidManifest.xml \ + -o overlay-shared.apk \ + --shared-lib \ compiled.flata aapt2 link \ --no-resource-removal \ - --shared-lib \ -I "$FRAMEWORK_RES_APK" \ - --manifest AndroidManifest.xml \ - -o overlay-shared.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 000000000000..f03eebbf6872 Binary files /dev/null and b/cmds/idmap2/tests/data/overlay/overlay-legacy.apk differ 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 dab25b1f8131..000000000000 Binary files a/cmds/idmap2/tests/data/overlay/overlay-no-name-static.apk and /dev/null differ diff --git a/cmds/idmap2/tests/data/overlay/overlay-no-name.apk b/cmds/idmap2/tests/data/overlay/overlay-no-name.apk deleted file mode 100644 index c8b95c2601ad..000000000000 Binary files a/cmds/idmap2/tests/data/overlay/overlay-no-name.apk and /dev/null differ diff --git a/cmds/idmap2/tests/data/overlay/overlay-shared.apk b/cmds/idmap2/tests/data/overlay/overlay-shared.apk index 0a8b7372172e..3c896ea79505 100644 Binary files a/cmds/idmap2/tests/data/overlay/overlay-shared.apk and b/cmds/idmap2/tests/data/overlay/overlay-shared.apk differ 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 fd41182f8493..000000000000 Binary files a/cmds/idmap2/tests/data/overlay/overlay-static-1.apk and /dev/null differ 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 b24765fc666a..000000000000 Binary files a/cmds/idmap2/tests/data/overlay/overlay-static-2.apk and /dev/null differ diff --git a/cmds/idmap2/tests/data/overlay/overlay.apk b/cmds/idmap2/tests/data/overlay/overlay.apk index 870575efa10c..c7ea623f64f2 100644 Binary files a/cmds/idmap2/tests/data/overlay/overlay.apk and b/cmds/idmap2/tests/data/overlay/overlay.apk differ diff --git a/cmds/idmap2/tests/data/overlay/res/values/values.xml b/cmds/idmap2/tests/data/overlay/res/values/values.xml index 815d1a88fa7b..6e98b212cee6 100644 --- a/cmds/idmap2/tests/data/overlay/res/values/values.xml +++ b/cmds/idmap2/tests/data/overlay/res/values/values.xml @@ -18,4 +18,25 @@ overlay-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 000000000000..747f448d46fd --- /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 5df0bea555b1..000000000000 --- 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 fdd8301c3b7d..000000000000 --- 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 59e7d8ed69c1..000000000000 --- 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 e0fd20499671..000000000000 Binary files a/cmds/idmap2/tests/data/signature-overlay/signature-overlay.apk and /dev/null differ diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml b/cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml deleted file mode 100644 index c7b652cdb287..000000000000 --- a/cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - 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 920e1f8ad6f3..000000000000 --- 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 ebaf49c34762..000000000000 --- 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 a63daf86caf5..000000000000 Binary files a/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk and /dev/null differ diff --git a/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml b/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml deleted file mode 100644 index 9e6a4536cb51..000000000000 --- a/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/cmds/idmap2/tests/data/system-overlay/build b/cmds/idmap2/tests/data/system-overlay/build deleted file mode 100755 index be0d2390f535..000000000000 --- 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 6aaa0b02639e..000000000000 --- 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 90d2803a1eca..000000000000 Binary files a/cmds/idmap2/tests/data/system-overlay/system-overlay.apk and /dev/null differ diff --git a/libs/androidfw/Idmap.cpp b/libs/androidfw/Idmap.cpp index 68844be6d14a..73e040c42826 100644 --- a/libs/androidfw/Idmap.cpp +++ b/libs/androidfw/Idmap.cpp @@ -288,7 +288,8 @@ std::unique_ptr 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 d1622a03a318..bfd564c258ee 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 c8ad86ded851..67036959d185 100644 Binary files a/libs/androidfw/tests/data/app/app.apk and b/libs/androidfw/tests/data/app/app.apk differ diff --git a/libs/androidfw/tests/data/overlay/overlay.idmap b/libs/androidfw/tests/data/overlay/overlay.idmap index 6f0104a52f68..723413c3cea8 100644 Binary files a/libs/androidfw/tests/data/overlay/overlay.idmap and b/libs/androidfw/tests/data/overlay/overlay.idmap differ -- cgit v1.2.3-59-g8ed1b