diff options
author | Ryan Mitchell <rtmitchell@google.com> | 2020-09-29 17:22:52 -0700 |
---|---|---|
committer | Ryan Mitchell <rtmitchell@google.com> | 2020-10-14 14:52:52 -0700 |
commit | bf1f45b071bd2fb28cbea7e7cea86cd2e4944a7c (patch) | |
tree | 81521006b59c4e16a7b593f0fe123be5f2f54c0c /cmds/idmap2/libidmap2/ResourceMapping.cpp | |
parent | 0f942f99cac4f5f61b40847d20ecb3a94c96c843 (diff) |
Remove malloc/free for inline overlay values
Remove malloc/free of android::ResTable_entry for inline overlay
values.
Add `target_entry_inline` to the idmap format to encode inline overlay
values separate from direct mapping of target resource to overlay
resource. This reduces the number of bytes needed to represent a direct
mapping of target resource to overlay resource from 9 bytes to 8 bytes
per entry.
Fixed all idmap alignment issues that required the framework to use
"#pragma pack(push, 1)" when loading idmaps.
Bug: 170341022
Test: idmap2_tests and libandroidfw_tests
Change-Id: Iab4d3902508f02773464724913e0ee966e3689e4
Diffstat (limited to 'cmds/idmap2/libidmap2/ResourceMapping.cpp')
-rw-r--r-- | cmds/idmap2/libidmap2/ResourceMapping.cpp | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/cmds/idmap2/libidmap2/ResourceMapping.cpp b/cmds/idmap2/libidmap2/ResourceMapping.cpp index fd8b4eb86b4a..122f0682aec6 100644 --- a/cmds/idmap2/libidmap2/ResourceMapping.cpp +++ b/cmds/idmap2/libidmap2/ResourceMapping.cpp @@ -205,19 +205,14 @@ Result<ResourceMapping> ResourceMapping::CreateResourceMapping(const AssetManage overlay_resource->data += string_pool_offset; } - // Only rewrite resources defined within the overlay package to their corresponding target - // resource ids at runtime. - bool rewrite_overlay_reference = - IsReference(overlay_resource->dataType) - ? overlay_package_id == EXTRACT_PACKAGE(overlay_resource->data) - : false; - - if (rewrite_overlay_reference) { - overlay_resource->dataType = Res_value::TYPE_DYNAMIC_REFERENCE; + if (IsReference(overlay_resource->dataType)) { + // Only rewrite resources defined within the overlay package to their corresponding target + // resource ids at runtime. + bool rewrite_reference = overlay_package_id == EXTRACT_PACKAGE(overlay_resource->data); + resource_mapping.AddMapping(target_id, overlay_resource->data, rewrite_reference); + } else { + resource_mapping.AddMapping(target_id, overlay_resource->dataType, overlay_resource->data); } - - resource_mapping.AddMapping(target_id, overlay_resource->dataType, overlay_resource->data, - rewrite_overlay_reference); } return resource_mapping; @@ -246,9 +241,8 @@ Result<ResourceMapping> ResourceMapping::CreateResourceMappingLegacy( // Retrieve the compile-time resource id of the target resource. target_resource = REWRITE_PACKAGE(target_resource, target_package_id); - - resource_mapping.AddMapping(target_resource, Res_value::TYPE_REFERENCE, overlay_resid, - /* rewrite_overlay_reference */ false); + resource_mapping.AddMapping(target_resource, overlay_resid, + false /* rewrite_overlay_reference */); } return resource_mapping; @@ -396,9 +390,7 @@ OverlayResourceMap ResourceMapping::GetOverlayToTargetMap() const { return map; } -Result<Unit> ResourceMapping::AddMapping(ResourceId target_resource, - TargetValue::DataType data_type, - TargetValue::DataValue data_value, +Result<Unit> ResourceMapping::AddMapping(ResourceId target_resource, ResourceId overlay_resource, bool rewrite_overlay_reference) { if (target_map_.find(target_resource) != target_map_.end()) { return Error(R"(target resource id "0x%08x" mapped to multiple values)", target_resource); @@ -407,13 +399,26 @@ Result<Unit> ResourceMapping::AddMapping(ResourceId target_resource, // TODO(141485591): Ensure that the overlay type is compatible with the target type. If the // runtime types are not compatible, it could cause runtime crashes when the resource is resolved. - target_map_.insert(std::make_pair(target_resource, TargetValue{data_type, data_value})); + target_map_.insert(std::make_pair(target_resource, overlay_resource)); - if (rewrite_overlay_reference && IsReference(data_type)) { - overlay_map_.insert(std::make_pair(data_value, target_resource)); + if (rewrite_overlay_reference) { + overlay_map_.insert(std::make_pair(overlay_resource, target_resource)); } + return Unit{}; +} - return Result<Unit>({}); +Result<Unit> ResourceMapping::AddMapping(ResourceId target_resource, + TargetValue::DataType data_type, + TargetValue::DataValue data_value) { + if (target_map_.find(target_resource) != target_map_.end()) { + return Error(R"(target resource id "0x%08x" mapped to multiple values)", target_resource); + } + + // TODO(141485591): Ensure that the overlay type is compatible with the target type. If the + // runtime types are not compatible, it could cause runtime crashes when the resource is resolved. + + target_map_.insert(std::make_pair(target_resource, TargetValue{data_type, data_value})); + return Unit{}; } void ResourceMapping::RemoveMapping(ResourceId target_resource) { @@ -422,14 +427,15 @@ void ResourceMapping::RemoveMapping(ResourceId target_resource) { return; } - const TargetValue value = target_iter->second; + const auto value = target_iter->second; target_map_.erase(target_iter); - if (!IsReference(value.data_type)) { + const ResourceId* overlay_resource = std::get_if<ResourceId>(&value); + if (overlay_resource == nullptr) { return; } - auto overlay_iter = overlay_map_.equal_range(value.data_value); + auto overlay_iter = overlay_map_.equal_range(*overlay_resource); for (auto i = overlay_iter.first; i != overlay_iter.second; ++i) { if (i->second == target_resource) { overlay_map_.erase(i); |