diff options
Diffstat (limited to 'cmds/idmap2/libidmap2/ResourceMapping.cpp')
-rw-r--r-- | cmds/idmap2/libidmap2/ResourceMapping.cpp | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/cmds/idmap2/libidmap2/ResourceMapping.cpp b/cmds/idmap2/libidmap2/ResourceMapping.cpp index 31f1c16ba5a6..d777cbfa9a14 100644 --- a/cmds/idmap2/libidmap2/ResourceMapping.cpp +++ b/cmds/idmap2/libidmap2/ResourceMapping.cpp @@ -71,9 +71,10 @@ Result<Unit> CheckOverlayable(const LoadedPackage& target_package, if (!target_package.DefinesOverlayable()) { return (sDefaultPolicies & fulfilled_policies) != 0 ? Result<Unit>({}) - : Error("overlay must be preinstalled, signed with the same signature as the target," - " or signed with the same signature as the package referenced through" - " <overlay-config-signature>."); + : Error( + "overlay must be preinstalled, signed with the same signature as the target," + " or signed with the same signature as the package referenced through" + " <overlay-config-signature>."); } const OverlayableInfo* overlayable_info = target_package.GetOverlayableInfo(target_resource); @@ -119,32 +120,25 @@ const LoadedPackage* GetPackageAtIndex0(const LoadedArsc& loaded_arsc) { Result<std::unique_ptr<Asset>> OpenNonAssetFromResource(const ResourceId& resource_id, const AssetManager2& asset_manager) { - Res_value value{}; - ResTable_config selected_config{}; - uint32_t flags; - auto cookie = - asset_manager.GetResource(resource_id, /* may_be_bag */ false, - /* density_override */ 0U, &value, &selected_config, &flags); - if (cookie == kInvalidCookie) { + auto value = asset_manager.GetResource(resource_id); + if (!value.has_value()) { return Error("failed to find resource for id 0x%08x", resource_id); } - if (value.dataType != Res_value::TYPE_STRING) { + if (value->type != Res_value::TYPE_STRING) { return Error("resource for is 0x%08x is not a file", resource_id); } - auto string_pool = asset_manager.GetStringPoolForCookie(cookie); - size_t len; - auto file_path16 = string_pool->stringAt(value.data, &len); - if (file_path16 == nullptr) { - return Error("failed to find string for index %d", value.data); + auto string_pool = asset_manager.GetStringPoolForCookie(value->cookie); + auto file = string_pool->string8ObjectAt(value->data); + if (!file.has_value()) { + return Error("failed to find string for index %d", value->data); } // Load the overlay resource mappings from the file specified using android:resourcesMap. - auto file_path = String8(String16(file_path16)); - auto asset = asset_manager.OpenNonAsset(file_path.c_str(), Asset::AccessMode::ACCESS_BUFFER); + auto asset = asset_manager.OpenNonAsset(file->c_str(), Asset::AccessMode::ACCESS_BUFFER); if (asset == nullptr) { - return Error("file \"%s\" not found", file_path.c_str()); + return Error("file \"%s\" not found", file->c_str()); } return asset; @@ -190,16 +184,16 @@ Result<ResourceMapping> ResourceMapping::CreateResourceMapping(const AssetManage return Error(R"(<item> tag missing expected attribute "value")"); } - ResourceId target_id = + auto target_id_result = target_am->GetResourceId(*target_resource, "", target_package->GetPackageName()); - if (target_id == 0U) { + if (!target_id_result.has_value()) { log_info.Warning(LogMessage() << "failed to find resource \"" << *target_resource << "\" in target resources"); continue; } // Retrieve the compile-time resource id of the target resource. - target_id = REWRITE_PACKAGE(target_id, target_package_id); + uint32_t target_id = REWRITE_PACKAGE(*target_id_result, target_package_id); if (overlay_resource->dataType == Res_value::TYPE_STRING) { overlay_resource->data += string_pool_offset; @@ -220,7 +214,7 @@ Result<ResourceMapping> ResourceMapping::CreateResourceMapping(const AssetManage Result<ResourceMapping> ResourceMapping::CreateResourceMappingLegacy( const AssetManager2* target_am, const AssetManager2* overlay_am, - const LoadedPackage* target_package, const LoadedPackage* overlay_package) { + const LoadedPackage* target_package, const LoadedPackage* overlay_package, LogInfo& log_info) { ResourceMapping resource_mapping; const uint8_t target_package_id = target_package->GetPackageId(); const auto end = overlay_package->end(); @@ -234,13 +228,15 @@ Result<ResourceMapping> ResourceMapping::CreateResourceMappingLegacy( // Find the resource with the same type and entry name within the target package. const std::string full_name = base::StringPrintf("%s:%s", target_package->GetPackageName().c_str(), name->c_str()); - ResourceId target_resource = target_am->GetResourceId(full_name); - if (target_resource == 0U) { + auto target_resource_result = target_am->GetResourceId(full_name); + if (!target_resource_result.has_value()) { + log_info.Warning(LogMessage() << "failed to find resource \"" << full_name + << "\" in target resources"); continue; } // Retrieve the compile-time resource id of the target resource. - target_resource = REWRITE_PACKAGE(target_resource, target_package_id); + ResourceId target_resource = REWRITE_PACKAGE(*target_resource_result, target_package_id); resource_mapping.AddMapping(target_resource, overlay_resid, false /* rewrite_overlay_reference */); } @@ -347,7 +343,9 @@ Result<ResourceMapping> ResourceMapping::FromApkAssets(const ApkAssets& target_a auto& string_pool = (*parser)->get_strings(); string_pool_data_length = string_pool.bytes(); string_pool_data.reset(new uint8_t[string_pool_data_length]); - memcpy(string_pool_data.get(), string_pool.data(), string_pool_data_length); + + // Overlays should not be incrementally installed, so calling unsafe_ptr is fine here. + memcpy(string_pool_data.get(), string_pool.data().unsafe_ptr(), string_pool_data_length); // Offset string indices by the size of the overlay resource table string pool. string_pool_offset = overlay_arsc->GetStringPool()->size(); @@ -358,7 +356,7 @@ Result<ResourceMapping> ResourceMapping::FromApkAssets(const ApkAssets& target_a // If no file is specified using android:resourcesMap, it is assumed that the overlay only // defines resources intended to override target resources of the same type and name. resource_mapping = CreateResourceMappingLegacy(&target_asset_manager, &overlay_asset_manager, - target_pkg, overlay_pkg); + target_pkg, overlay_pkg, log_info); } if (!resource_mapping) { |