AAPT: Modified StringPool uniqueness detection

b/77862560 detected that when converting an apk to binary using aapt2,
all resource ids of attributes that have been replaced with resource
identifiers become set to the identifier of the first attribute. This is
because the attribute names are all empty because the names are not necessary
since the resource ids are present. The empty attribute names all map to
the same string pool reference and cause all the ids to be the first
empty string into the string pool.

Bug: 77862560
Test: Converted apk in listed bug from proto to binary and observed
correct resource ids and correct badging.

Change-Id: I635c13cd1ad7a395fe40a57198cfe5ec91602d01
This commit is contained in:
y
2018-04-13 11:25:12 -07:00
parent a668c66301
commit 35ecb89a8a
2 changed files with 15 additions and 4 deletions

View File

@@ -172,9 +172,10 @@ StringPool::Ref StringPool::MakeRef(const StringPiece& str, const Context& conte
StringPool::Ref StringPool::MakeRefImpl(const StringPiece& str, const Context& context,
bool unique) {
if (unique) {
auto iter = indexed_strings_.find(str);
if (iter != std::end(indexed_strings_)) {
return Ref(iter->second);
for (auto& indexed_str : indexed_strings_) {
if (str == indexed_str.first && context.priority == indexed_str.second->context.priority) {
return Ref(indexed_str.second);
}
}
}

View File

@@ -61,6 +61,17 @@ TEST(StringPoolTest, DoNotInsertNewDuplicateString) {
EXPECT_THAT(pool.size(), Eq(1u));
}
TEST(StringPoolTest, DoNotDedupeSameStringDifferentPriority) {
StringPool pool;
StringPool::Ref ref_a = pool.MakeRef("wut", StringPool::Context(1));
StringPool::Ref ref_b = pool.MakeRef("wut", StringPool::Context(2));
EXPECT_THAT(*ref_a, Eq("wut"));
EXPECT_THAT(*ref_b, Eq("wut"));
EXPECT_THAT(pool.size(), Eq(2u));
}
TEST(StringPoolTest, MaintainInsertionOrderIndex) {
StringPool pool;
@@ -292,7 +303,6 @@ TEST(StringPoolTest, Flatten) {
}
}
TEST(StringPoolTest, MaxEncodingLength) {
StdErrDiagnostics diag;
using namespace android; // For NO_ERROR on Windows.