Skip to content

Commit

Permalink
fix DexWriter for hiddenapi section
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Roberts authored and JesusFreke committed Mar 8, 2022
1 parent 891703d commit 81bd303
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
Expand Up @@ -221,6 +221,14 @@ public int compare(Entry<? extends CallSiteKey, Integer> o1, Entry<? extends Cal
};
}

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) {
Expand Down Expand Up @@ -491,24 +499,27 @@ private void writeClasses(@Nonnull DexDataStore dataStore, @Nonnull DexDataWrite
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);
}

if (!shouldWriteHiddenApiRestrictions()) {
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));
Expand Down

0 comments on commit 81bd303

Please sign in to comment.