diff --git a/src/main/java/com/reandroid/apk/xmlencoder/XMLTableBlockEncoder.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLTableBlockEncoder.java index afcb4fa6d..67d8b4eb4 100644 --- a/src/main/java/com/reandroid/apk/xmlencoder/XMLTableBlockEncoder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLTableBlockEncoder.java @@ -187,7 +187,6 @@ private void encodeValues(List pubXmlFileList) throws IOException, XmlPull filePathEncoder.encodePackageResDir(packageBlock, resDir); packageBlock.sortTypes(); - packageBlock.refresh(); } } private void encodeAttrs(List pubXmlFileList) throws IOException, XmlPullParserException { diff --git a/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java b/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java index b5431d0dd..a64f01c25 100755 --- a/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java @@ -186,10 +186,6 @@ public SpecTypePair getParentSpecTypePair() { return getParent(SpecTypePair.class); } public Entry getOrCreateDefinedEntry(String name) { - Entry entry = getEntry(name); - if (entry != null) { - return entry; - } PackageBlock packageBlock = getPackageBlock(); if (packageBlock == null) { return null; @@ -198,6 +194,21 @@ public Entry getOrCreateDefinedEntry(String name) { if (id == 0) { return null; } + Entry entry = getEntry(id & 0xffff); + if (entry != null) { + String entryName = entry.getName(); + if (name.equals(entryName)) { + return entry; + } + if (entryName != null && !entry.isNull()) { + // The defined id holds a different name; fall back to + // scanning this type block by name. + Entry existing = getEntry(name); + if (existing != null) { + return existing; + } + } + } SpecStringPool stringPool = packageBlock.getSpecStringPool(); SpecString specString = stringPool.getOrCreate(name); entry = getOrCreateEntry(id & 0xffff); diff --git a/src/main/java/com/reandroid/arsc/container/BlockList.java b/src/main/java/com/reandroid/arsc/container/BlockList.java index cff7a2be7..9a89910e6 100755 --- a/src/main/java/com/reandroid/arsc/container/BlockList.java +++ b/src/main/java/com/reandroid/arsc/container/BlockList.java @@ -198,19 +198,10 @@ public void destroy() { onChanged(); } public boolean sort(Comparator comparator) { - if (size() < 2) { + if (!needsSort(comparator)) { return false; } - boolean sorted = mItems.sort(comparator, (i, j) -> { - T item1 = get(i); - T item2 = get(j); - if (item1 != null) { - item1.setIndex(i); - } - if (item2 != null) { - item2.setIndex(j); - } - }); + boolean sorted = mItems.sortItems(comparator); if (sorted) { updateIndex(); }