diff options
author | Michael Roberts <you@example.com> | 2021-05-13 01:40:45 -0400 |
---|---|---|
committer | Ben Gruver <bgruv@google.com> | 2022-03-08 14:50:22 -0600 |
commit | 81bd303a80b4413d4720243b2c80fb619d89bec8 (patch) | |
tree | ef3d013172121eca43354436ee3c08e48b08dea8 | |
parent | 891703dff20dddd5a3b421588a66c9c6fd989516 (diff) | |
download | google-smali-81bd303a80b4413d4720243b2c80fb619d89bec8.tar.gz |
fix DexWriter for hiddenapi section
-rw-r--r-- | dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java index 60a94bcb..c7c9f635 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java @@ -221,6 +221,14 @@ public abstract class DexWriter< }; } + private static <T extends Comparable<? super T>> Comparator<Entry<?, ? extends T>> comparableValueComparator() { + return new Comparator<Entry<?, ? extends T>>() { + @Override public int compare(Entry<?, ? extends T> o1, Entry<?, ? extends T> o2) { + return o1.getValue().compareTo(o2.getValue()); + } + }; + } + protected class InternalEncodedValueWriter extends EncodedValueWriter<StringKey, TypeKey, FieldRefKey, MethodRefKey, AnnotationElement, ProtoRefKey, MethodHandleKey, EncodedValue> { private InternalEncodedValueWriter(@Nonnull DexDataWriter writer) { @@ -491,11 +499,11 @@ public abstract class DexWriter< classIndexSectionOffset = indexWriter.getPosition(); classDataSectionOffset = offsetWriter.getPosition(); - List<Map.Entry<? extends ClassKey, Integer>> classEntries = Lists.newArrayList(classSection.getItems()); - Collections.sort(classEntries, DexWriter.<ClassKey>comparableKeyComparator()); + List<Map.Entry<? extends ClassKey, Integer>> classEntriesKeySorted = Lists.newArrayList(classSection.getItems()); + Collections.sort(classEntriesKeySorted, DexWriter.<ClassKey>comparableKeyComparator()); int index = 0; - for (Map.Entry<? extends ClassKey, Integer> key: classEntries) { + for (Map.Entry<? extends ClassKey, Integer> key: classEntriesKeySorted) { index = writeClass(indexWriter, offsetWriter, index, key); } @@ -503,12 +511,15 @@ public abstract class DexWriter< return; } + offsetWriter.align(); hiddenApiRestrictionsOffset = offsetWriter.getPosition(); - RestrictionsWriter restrictionsWriter = new RestrictionsWriter(dataStore, offsetWriter, classEntries.size()); + List<Map.Entry<? extends ClassKey, Integer>> classEntriesValueSorted = Lists.newArrayList(classSection.getItems()); + Collections.sort(classEntriesValueSorted, DexWriter.comparableValueComparator()); + RestrictionsWriter restrictionsWriter = new RestrictionsWriter(dataStore, offsetWriter, classEntriesValueSorted.size()); try { - for (Map.Entry<? extends ClassKey, Integer> key : classEntries) { + for (Map.Entry<? extends ClassKey, Integer> key : classEntriesValueSorted) { for (FieldKey fieldKey : classSection.getSortedStaticFields(key.getKey())) { restrictionsWriter.writeRestriction(classSection.getFieldHiddenApiRestrictions(fieldKey)); |