[aapt2] Fix finalized resources removal am: 834f4e6c92
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16102684 Change-Id: Iff52edf4399c67d2b0a6b4a9779f2825b277b4f0
This commit is contained in:
@@ -120,6 +120,13 @@ bool BinaryResourceParser::Parse() {
|
||||
static_cast<int>(parser.chunk()->type)));
|
||||
}
|
||||
}
|
||||
|
||||
if (!staged_entries_to_remove_.empty()) {
|
||||
diag_->Error(DiagMessage(source_) << "didn't find " << staged_entries_to_remove_.size()
|
||||
<< " original staged resources");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -393,6 +400,12 @@ bool BinaryResourceParser::ParseType(const ResourceTablePackage* package,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (const auto to_remove_it = staged_entries_to_remove_.find({name, res_id});
|
||||
to_remove_it != staged_entries_to_remove_.end()) {
|
||||
staged_entries_to_remove_.erase(to_remove_it);
|
||||
continue;
|
||||
}
|
||||
|
||||
NewResourceBuilder res_builder(name);
|
||||
res_builder.SetValue(std::move(resource_value), config)
|
||||
.SetId(res_id, OnIdConflict::CREATE_ENTRY)
|
||||
@@ -533,9 +546,8 @@ bool BinaryResourceParser::ParseStagedAliases(const ResChunk_header* chunk) {
|
||||
// Since a the finalized resource entry is cloned and added to the resource table under the
|
||||
// staged resource id, remove the cloned resource entry from the table.
|
||||
if (!table_->RemoveResource(resource_name, staged_id)) {
|
||||
diag_->Error(DiagMessage(source_) << "failed to find resource entry for staged "
|
||||
<< " resource ID " << staged_id);
|
||||
return false;
|
||||
// If we haven't seen this resource yet let's add a record to skip it when parsing.
|
||||
staged_entries_to_remove_.insert({resource_name, staged_id});
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -119,6 +119,10 @@ class BinaryResourceParser {
|
||||
|
||||
// A mapping of resource ID to type spec flags.
|
||||
std::unordered_map<ResourceId, uint32_t> entry_type_spec_flags_;
|
||||
|
||||
// A collection of staged resources that got finalized already and we're supposed to prune -
|
||||
// but the original staged resource record hasn't been parsed yet.
|
||||
std::set<std::pair<ResourceName, ResourceId>> staged_entries_to_remove_;
|
||||
};
|
||||
|
||||
} // namespace aapt
|
||||
|
||||
Reference in New Issue
Block a user