diff options
Diffstat (limited to 'cmds/idmap2/libidmap2/RawPrintVisitor.cpp')
-rw-r--r-- | cmds/idmap2/libidmap2/RawPrintVisitor.cpp | 123 |
1 files changed, 92 insertions, 31 deletions
diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp index dd14fd47aea8..13973d64fe68 100644 --- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp @@ -47,46 +47,94 @@ void RawPrintVisitor::visit(const IdmapHeader& header) { if (target_apk_) { target_am_.SetApkAssets({target_apk_.get()}); } + + overlay_apk_ = ApkAssets::Load(header.GetOverlayPath().to_string()); + if (overlay_apk_) { + overlay_am_.SetApkAssets({overlay_apk_.get()}); + } } void RawPrintVisitor::visit(const IdmapData& data ATTRIBUTE_UNUSED) { -} + const bool target_package_loaded = !target_am_.GetApkAssets().empty(); + const bool overlay_package_loaded = !overlay_am_.GetApkAssets().empty(); -void RawPrintVisitor::visit(const IdmapData::Header& header) { - print(static_cast<uint16_t>(header.GetTargetPackageId()), "target package id"); - print(header.GetTypeCount(), "type count"); - last_seen_package_id_ = header.GetTargetPackageId(); -} + for (auto& target_entry : data.GetTargetEntries()) { + Result<std::string> target_name(Error("")); + if (target_package_loaded) { + target_name = utils::ResToTypeEntryName(target_am_, target_entry.target_id); + } + if (target_name) { + print(target_entry.target_id, "target id: %s", target_name->c_str()); + } else { + print(target_entry.target_id, "target id"); + } -void RawPrintVisitor::visit(const IdmapData::TypeEntry& type_entry) { - const bool target_package_loaded = !target_am_.GetApkAssets().empty(); + print(target_entry.data_type, "type: %s", + utils::DataTypeToString(target_entry.data_type).data()); + + Result<std::string> overlay_name(Error("")); + if (overlay_package_loaded && (target_entry.data_type == Res_value::TYPE_REFERENCE || + target_entry.data_type == Res_value::TYPE_DYNAMIC_REFERENCE)) { + overlay_name = utils::ResToTypeEntryName(overlay_am_, target_entry.data_value); + } + if (overlay_name) { + print(target_entry.data_value, "value: %s", overlay_name->c_str()); + } else { + print(target_entry.data_value, "value"); + } + } + + for (auto& overlay_entry : data.GetOverlayEntries()) { + Result<std::string> overlay_name(Error("")); + if (overlay_package_loaded) { + overlay_name = utils::ResToTypeEntryName(overlay_am_, overlay_entry.overlay_id); + } + + if (overlay_name) { + print(overlay_entry.overlay_id, "overlay id: %s", overlay_name->c_str()); + } else { + print(overlay_entry.overlay_id, "overlay id"); + } - print(static_cast<uint16_t>(type_entry.GetTargetTypeId()), "target type"); - print(static_cast<uint16_t>(type_entry.GetOverlayTypeId()), "overlay type"); - print(static_cast<uint16_t>(type_entry.GetEntryCount()), "entry count"); - print(static_cast<uint16_t>(type_entry.GetEntryOffset()), "entry offset"); + Result<std::string> target_name(Error("")); + if (target_package_loaded) { + target_name = utils::ResToTypeEntryName(target_am_, overlay_entry.target_id); + } - for (uint16_t i = 0; i < type_entry.GetEntryCount(); i++) { - const EntryId entry = type_entry.GetEntry(i); - if (entry == kNoEntry) { - print(kPadding, "no entry"); + if (target_name) { + print(overlay_entry.target_id, "target id: %s", target_name->c_str()); } else { - const ResourceId target_resid = RESID(last_seen_package_id_, type_entry.GetTargetTypeId(), - type_entry.GetEntryOffset() + i); - const ResourceId overlay_resid = - RESID(last_seen_package_id_, type_entry.GetOverlayTypeId(), entry); - Result<std::string> name(Error("")); - if (target_package_loaded) { - name = utils::ResToTypeEntryName(target_am_, target_resid); - } - if (name) { - print(static_cast<uint32_t>(entry), "0x%08x -> 0x%08x %s", target_resid, overlay_resid, - name->c_str()); - } else { - print(static_cast<uint32_t>(entry), "0x%08x -> 0x%08x", target_resid, overlay_resid); - } + print(overlay_entry.target_id, "target id"); } } + + const size_t string_pool_length = data.GetHeader()->GetStringPoolLength(); + if (string_pool_length > 0) { + print_raw(string_pool_length, "%zu raw string pool bytes", string_pool_length); + } +} + +void RawPrintVisitor::visit(const IdmapData::Header& header) { + print(header.GetTargetPackageId(), "target package id"); + print(header.GetOverlayPackageId(), "overlay package id"); + print(header.GetTargetEntryCount(), "target entry count"); + print(header.GetOverlayEntryCount(), "overlay entry count"); + print(header.GetStringPoolIndexOffset(), "string pool index offset"); + print(header.GetStringPoolLength(), "string pool byte length"); +} + +// NOLINTNEXTLINE(cert-dcl50-cpp) +void RawPrintVisitor::print(uint8_t value, const char* fmt, ...) { + va_list ap; + va_start(ap, fmt); + std::string comment; + base::StringAppendV(&comment, fmt, ap); + va_end(ap); + + stream_ << base::StringPrintf("%08zx: %02x", offset_, value) << " " << comment + << std::endl; + + offset_ += sizeof(uint8_t); } // NOLINTNEXTLINE(cert-dcl50-cpp) @@ -123,10 +171,23 @@ void RawPrintVisitor::print(const std::string& value, const char* fmt, ...) { base::StringAppendV(&comment, fmt, ap); va_end(ap); - stream_ << base::StringPrintf("%08zx: ", offset_) << "........ " << comment << ": " << value + stream_ << base::StringPrintf("%08zx: ", offset_) << "........ " << comment << ": " << value << std::endl; offset_ += kIdmapStringLength; } +// NOLINTNEXTLINE(cert-dcl50-cpp) +void RawPrintVisitor::print_raw(uint32_t length, const char* fmt, ...) { + va_list ap; + va_start(ap, fmt); + std::string comment; + base::StringAppendV(&comment, fmt, ap); + va_end(ap); + + stream_ << base::StringPrintf("%08zx: ", offset_) << "........ " << comment << std::endl; + + offset_ += length; +} + } // namespace android::idmap2 |