diff options
Diffstat (limited to 'libs/androidfw/LoadedArsc.cpp')
-rw-r--r-- | libs/androidfw/LoadedArsc.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libs/androidfw/LoadedArsc.cpp b/libs/androidfw/LoadedArsc.cpp index cb620cc475a9..d17c32817994 100644 --- a/libs/androidfw/LoadedArsc.cpp +++ b/libs/androidfw/LoadedArsc.cpp @@ -41,6 +41,7 @@ using android::base::StringPrintf; namespace android { +constexpr const static int kFrameworkPackageId = 0x01; constexpr const static int kAppPackageId = 0x7f; namespace { @@ -675,6 +676,42 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk, } } break; + case RES_TABLE_STAGED_ALIAS_TYPE: { + if (loaded_package->package_id_ != kFrameworkPackageId) { + LOG(WARNING) << "Alias chunk ignored for non-framework package '" + << loaded_package->package_name_ << "'"; + break; + } + + std::unordered_set<uint32_t> finalized_ids; + const auto lib_alias = child_chunk.header<ResTable_staged_alias_header>(); + if (!lib_alias) { + return {}; + } + const auto entry_begin = child_chunk.data_ptr().convert<ResTable_staged_alias_entry>(); + const auto entry_end = entry_begin + dtohl(lib_alias->count); + for (auto entry_iter = entry_begin; entry_iter != entry_end; ++entry_iter) { + if (!entry_iter) { + return {}; + } + auto finalized_id = dtohl(entry_iter->finalizedResId); + if (!finalized_ids.insert(finalized_id).second) { + LOG(ERROR) << StringPrintf("Repeated finalized resource id '%08x' in staged aliases.", + finalized_id); + return {}; + } + + auto staged_id = dtohl(entry_iter->stagedResId); + auto [_, success] = loaded_package->alias_id_map_.insert(std::make_pair(staged_id, + finalized_id)); + if (!success) { + LOG(ERROR) << StringPrintf("Repeated staged resource id '%08x' in staged aliases.", + staged_id); + return {}; + } + } + } break; + default: LOG(WARNING) << StringPrintf("Unknown chunk type '%02x'.", chunk.type()); break; |