Ensure the annotation elements are sorted when written

This commit is contained in:
Ben Gruver
2014-07-15 22:34:50 -07:00
committed by Connor Tumbleson
parent b66bf0500b
commit ca13778fe8
3 changed files with 113 additions and 4 deletions

View File

@ -31,11 +31,15 @@
package org.jf.dexlib2.writer;
import com.google.common.collect.*;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import org.jf.dexlib2.AccessFlags;
import org.jf.dexlib2.Opcode;
import org.jf.dexlib2.ReferenceType;
import org.jf.dexlib2.base.BaseAnnotation;
import org.jf.dexlib2.base.BaseAnnotationElement;
import org.jf.dexlib2.builder.MutableMethodImplementation;
import org.jf.dexlib2.builder.instruction.BuilderInstruction31c;
import org.jf.dexlib2.dexbacked.raw.*;
@ -48,7 +52,10 @@ import org.jf.dexlib2.iface.instruction.Instruction;
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
import org.jf.dexlib2.iface.instruction.formats.*;
import org.jf.dexlib2.iface.reference.*;
import org.jf.dexlib2.iface.reference.FieldReference;
import org.jf.dexlib2.iface.reference.MethodReference;
import org.jf.dexlib2.iface.reference.StringReference;
import org.jf.dexlib2.iface.reference.TypeReference;
import org.jf.dexlib2.util.InstructionUtil;
import org.jf.dexlib2.util.MethodUtil;
import org.jf.dexlib2.writer.io.DeferredOutputStream;
@ -81,7 +88,8 @@ public abstract class DexWriter<
AnnotationKey extends Annotation, AnnotationSetKey,
TypeListKey,
FieldKey, MethodKey,
EncodedValue, AnnotationElement> {
EncodedValue,
AnnotationElement extends org.jf.dexlib2.iface.AnnotationElement> {
public static final int NO_INDEX = -1;
public static final int NO_OFFSET = 0;
@ -552,7 +560,9 @@ public abstract class DexWriter<
writer.writeUbyte(annotationSection.getVisibility(key));
writer.writeUleb128(typeSection.getItemIndex(annotationSection.getType(key)));
Collection<? extends AnnotationElement> elements = annotationSection.getElements(key);
Collection<? extends AnnotationElement> elements = Ordering.from(BaseAnnotationElement.BY_NAME)
.immutableSortedCopy(annotationSection.getElements(key));
writer.writeUleb128(elements.size());
for (AnnotationElement element: elements) {

View File

@ -39,6 +39,7 @@ import org.jf.dexlib2.iface.Field;
import org.jf.dexlib2.iface.reference.*;
import org.jf.dexlib2.iface.value.*;
import org.jf.dexlib2.writer.DexWriter;
import org.jf.dexlib2.writer.io.DexDataStore;
import org.jf.dexlib2.writer.io.FileDataStore;
import org.jf.dexlib2.writer.pool.ProtoPool.Key;
import org.jf.util.ExceptionWithContext;
@ -82,6 +83,14 @@ public class DexPool extends DexWriter<CharSequence, StringReference, CharSequen
classPool, typeListPool, annotationPool, annotationSetPool);
}
public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
DexPool dexPool = makeDexPool();
for (ClassDef classDef: input.getClasses()) {
((ClassPool)dexPool.classSection).intern(classDef);
}
dexPool.writeTo(dataStore);
}
public static void writeTo(@Nonnull String path, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
DexPool dexPool = makeDexPool();
for (ClassDef classDef: input.getClasses()) {