Fix loaded apk string pool order
Loading in an APk changed the ordering of strings in the string pool. When loading an apk, assign the strings to the same index as they are in the ResStringPool. Bug: 118831219 Test: "aapt2 dump strings left.apk" prints in the correct order, "aapt2 convert left.apk --output-format binary -o left_binary.apk" has entries in the correct order, and aapt2_tests Change-Id: I00014c02195f39c1152a110e90083d9b14e9216e
This commit is contained in:
@@ -165,12 +165,13 @@ StringPool::Ref StringPool::MakeRef(const StringPiece& str) {
|
||||
return MakeRefImpl(str, Context{}, true);
|
||||
}
|
||||
|
||||
StringPool::Ref StringPool::MakeRef(const StringPiece& str, const Context& context) {
|
||||
return MakeRefImpl(str, context, true);
|
||||
StringPool::Ref StringPool::MakeRef(const StringPiece& str, const Context& context,
|
||||
Maybe<size_t> index) {
|
||||
return MakeRefImpl(str, context, true, index);
|
||||
}
|
||||
|
||||
StringPool::Ref StringPool::MakeRefImpl(const StringPiece& str, const Context& context,
|
||||
bool unique) {
|
||||
bool unique, Maybe<size_t> index) {
|
||||
if (unique) {
|
||||
auto range = indexed_strings_.equal_range(str);
|
||||
for (auto iter = range.first; iter != range.second; ++iter) {
|
||||
@@ -180,15 +181,26 @@ StringPool::Ref StringPool::MakeRefImpl(const StringPiece& str, const Context& c
|
||||
}
|
||||
}
|
||||
|
||||
const size_t size = strings_.size();
|
||||
// Insert the string at the end of the string vector if no index is specified
|
||||
const size_t insertion_index = index ? index.value() : size;
|
||||
|
||||
std::unique_ptr<Entry> entry(new Entry());
|
||||
entry->value = str.to_string();
|
||||
entry->context = context;
|
||||
entry->index_ = strings_.size();
|
||||
entry->index_ = insertion_index;
|
||||
entry->ref_ = 0;
|
||||
entry->pool_ = this;
|
||||
|
||||
Entry* borrow = entry.get();
|
||||
strings_.emplace_back(std::move(entry));
|
||||
if (insertion_index == size) {
|
||||
strings_.emplace_back(std::move(entry));
|
||||
} else {
|
||||
// Allocate enough space for the string at the index
|
||||
strings_.resize(std::max(insertion_index + 1, size));
|
||||
strings_[insertion_index] = std::move(entry);
|
||||
}
|
||||
|
||||
indexed_strings_.insert(std::make_pair(StringPiece(borrow->value), borrow));
|
||||
return Ref(borrow);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user