diff --git a/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java b/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java index 7647f564..f0790644 100644 --- a/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java @@ -44,6 +44,14 @@ public class AnnotationDirectoryItem extends OffsettedItem fieldAnnotationListField; private final FieldListField methodAnnotationListField; private final FieldListField parameterAnnotationListField; + + + //typically each AnnotationDirectoryItem will have a distinct parent. The only case that isn't true is when + //the AnnotationDirectoryItem *only* contains class annotations, with no other type of annotation. In that + //case, the same AnnotationDirectoryItem could be references from multiple classes. + //This isn't a problem though, because this field is only used in compareTo to determine the sort order, + //which handles it as a special case + private ClassDefItem parent = null; protected AnnotationDirectoryItem(final DexFile dexFile, int offset) { super(offset); @@ -135,6 +143,48 @@ public class AnnotationDirectoryItem extends OffsettedItem 0 || + methodAnnotationList.size() > 0 || + parameterAnnotationList.size() > 0) { + return false; + } + return true; + } + + public int hashCode() { + //an instance is only internable if it has only class annotations, but + //no other type of annotation + if (!isInternable()) { + return super.hashCode(); + } + return classAnnotationsReferenceField.getReference().hashCode(); + } + + protected void setParent(ClassDefItem classDefItem) { + this.parent = classDefItem; + } + + public int compareTo(AnnotationDirectoryItem annotationDirectoryItem) { + if (!isInternable()) { + if (!annotationDirectoryItem.isInternable()) { + return parent.compareTo(annotationDirectoryItem.parent); + } + return -1; + } + + if (!annotationDirectoryItem.isInternable()) { + return 1; + } + + return classAnnotationsReferenceField.getReference().compareTo( + annotationDirectoryItem.classAnnotationsReferenceField.getReference()); + } + public static class FieldAnnotation extends CompositeField implements Comparable { private final IndexedItemReference fieldReferenceField; diff --git a/dexlib/src/main/java/org/jf/dexlib/AnnotationItem.java b/dexlib/src/main/java/org/jf/dexlib/AnnotationItem.java index 57451568..b7ab41dc 100644 --- a/dexlib/src/main/java/org/jf/dexlib/AnnotationItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/AnnotationItem.java @@ -69,6 +69,14 @@ public class AnnotationItem extends OffsettedItem { return annotationField; } + public int compareTo(AnnotationItem annotationItem) { + int comp = ((Integer)visibilityField.getCachedValue()).compareTo(annotationItem.visibilityField.getCachedValue()); + if (comp == 0) { + comp = annotationField.compareTo(annotationItem.annotationField); + } + return comp; + } + public enum Visibility { build(0x00), runtime(0x01), diff --git a/dexlib/src/main/java/org/jf/dexlib/AnnotationSetItem.java b/dexlib/src/main/java/org/jf/dexlib/AnnotationSetItem.java index 97db1abf..725411c1 100644 --- a/dexlib/src/main/java/org/jf/dexlib/AnnotationSetItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/AnnotationSetItem.java @@ -83,4 +83,22 @@ public class AnnotationSetItem extends OffsettedItem { } return annotationItems; } + + public int compareTo(AnnotationSetItem annotationSetItem) { + if (annotationSetItem == null) { + return 1; + } + + int comp = ((Integer)annotationReferences.size()).compareTo(annotationSetItem.annotationReferences.size()); + if (comp == 0) { + for (int i=0; i { return annotationSets; } + + public int compareTo(AnnotationSetRefList annotationSetRefList) { + int comp = ((Integer)annotationSetReferences.size()).compareTo(annotationSetRefList.annotationSetReferences.size()); + if (comp == 0) { + for (int i=0; i { private final EncodedMemberList directMethodsListField; private final EncodedMemberList virtualMethodsListField; + private ClassDefItem parent = null; public ClassDataItem(final DexFile dexFile, int offset) { super(offset); @@ -310,6 +311,10 @@ public class ClassDataItem extends OffsettedItem { this.codeItemReferenceField = new OffsettedItemReference(dexFile, codeItem, new Leb128Field(null), "code_off") }; + + if (codeItem != null) { + codeItem.setParent(methodIdItem); + } } protected void setPreviousMember(EncodedMethod previousMethod) { @@ -329,6 +334,14 @@ public class ClassDataItem extends OffsettedItem { AccessFlags.CONSTRUCTOR.getValue())) != 0); } + public void readFrom(Input in) { + super.readFrom(in); + CodeItem codeItem = codeItemReferenceField.getReference(); + if (codeItem != null) { + codeItem.setParent(methodReferenceField.getReference()); + } + } + public int getAccessFlags() { return accessFlagsField.getCachedValue(); } @@ -396,4 +409,21 @@ public class ClassDataItem extends OffsettedItem { public String getConciseIdentity() { return "class_data_item @0x" + Integer.toHexString(getOffset()); } + + protected void setParent(ClassDefItem classDefItem) { + this.parent = classDefItem; + } + + public int compareTo(ClassDataItem other) { + if (parent == null) { + if (other.parent == null) { + return 0; + } + return -1; + } + if (other.parent == null) { + return 1; + } + return parent.compareTo(other.parent); + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java b/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java index 5cf98f2d..837297d3 100644 --- a/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java @@ -31,10 +31,9 @@ package org.jf.dexlib; import org.jf.dexlib.EncodedValue.EncodedValue; import org.jf.dexlib.EncodedValue.EncodedValueSubField; import org.jf.dexlib.Util.TypeUtils; +import org.jf.dexlib.Util.Input; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class ClassDefItem extends IndexedItem { private final IndexedItemReference classTypeReferenceField; @@ -90,6 +89,10 @@ public class ClassDefItem extends IndexedItem { classInterfacesListReferenceField.setReference(implementsList); sourceFileReferenceField.setReference(source); classDataReferenceField.setReference(classDataItem); + + if (classDataItem != null) { + classDataItem.setParent(this); + } } public TypeIdItem getSuperclass() { @@ -162,9 +165,10 @@ public class ClassDefItem extends IndexedItem { } public int compareTo(ClassDefItem o) { - //sorting is implemented in SortClassDefItemSection, so this class doesn't - //need an implementation of compareTo - return 0; + //The actual sorting for this class is implemented in SortClassDefItemSection. + //This method is just used for sorting the associated ClassDataItem items, so + //we can just do the comparison based on the offsets of the items + return ((Integer)this.offset).compareTo(o.offset); } public void addField(ClassDataItem.EncodedField encodedField, EncodedValue initialValue) { @@ -205,10 +209,28 @@ public class ClassDefItem extends IndexedItem { public void setAnnotations(AnnotationDirectoryItem annotations) { this.classAnnotationsReferenceField.setReference(annotations); + annotations.setParent(this); } public void setClassDataItem(ClassDataItem classDataItem) { this.classDataReferenceField.setReference(classDataItem); + if (classDataItem != null) { + classDataItem.setParent(this); + } + } + + public void readFrom(Input in, int index) { + super.readFrom(in, index); + + ClassDataItem classDataItem = classDataReferenceField.getReference(); + if (classDataItem != null) { + classDataItem.setParent(this); + } + + AnnotationDirectoryItem annotationDirectoryItem = classAnnotationsReferenceField.getReference(); + if (annotationDirectoryItem != null) { + annotationDirectoryItem.setParent(this); + } } public static int placeClassDefItems(IndexedSection section, int offset) { @@ -238,6 +260,18 @@ public class ClassDefItem extends IndexedItem { public int placeSection(int offset) { currentOffset = offset; + + //presort the list, to guarantee a unique ordering + Collections.sort(section.items, new Comparator() { + public int compare(ClassDefItem classDefItem, ClassDefItem classDefItem1) { + return classDefItem.getClassType().compareTo(classDefItem1.getClassType()); + } + }); + + for (ClassDefItem classDefItem: section.items) { + classDefItem.offset = -1; + } + for (ClassDefItem classDefItem: section.items) { placeClass(classDefItem); } diff --git a/dexlib/src/main/java/org/jf/dexlib/CodeItem.java b/dexlib/src/main/java/org/jf/dexlib/CodeItem.java index 82d907e0..69035079 100644 --- a/dexlib/src/main/java/org/jf/dexlib/CodeItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/CodeItem.java @@ -54,6 +54,8 @@ public class CodeItem extends OffsettedItem { private final FieldListField triesListField; private final EncodedCatchHandlerList catchHandlersListField; + private MethodIdItem parent = null; + public CodeItem(final DexFile dexFile, int offset) { super(offset); @@ -105,6 +107,10 @@ public class CodeItem extends OffsettedItem { inArgumentCountField.cacheValue(inArguments); outArgumentCountField.cacheValue(instructionListField.getOutArguments()); debugInfoReferenceField.setReference(debugInfo); + + if (debugInfo != null) { + debugInfo.setParent(this); + } } protected int getAlignment() { @@ -131,6 +137,10 @@ public class CodeItem extends OffsettedItem { return debugInfoReferenceField.getReference(); } + protected void setParent(MethodIdItem methodIdItem) { + this.parent = methodIdItem; + } + public void copyTo(DexFile dexFile, CodeItem copy) { for (int i = 0; i < fields.length-2; i++) { @@ -140,6 +150,20 @@ public class CodeItem extends OffsettedItem { //the catchHandler copies will already exist catchHandlersListField.copyTo(dexFile, copy.catchHandlersListField); triesListField.copyTo(dexFile, copy.triesListField); + + DebugInfoItem copyDebugInfo = copy.getDebugInfo(); + if (copy != null) { + copyDebugInfo.setParent(copy); + } + } + + public void readFrom(Input in, int index) { + super.readFrom(in, index); + + DebugInfoItem debugInfoItem = debugInfoReferenceField.getReference(); + if (debugInfoItem != null) { + debugInfoItem.setParent(this); + } } public String getConciseIdentity() { @@ -147,6 +171,19 @@ public class CodeItem extends OffsettedItem { return "code_item @0x" + Integer.toHexString(getOffset()); } + public int compareTo(CodeItem other) { + if (parent == null) { + if (other.parent == null) { + return 0; + } + return -1; + } + if (other.parent == null) { + return 1; + } + return parent.compareTo(other.parent); + } + public static class TryItem extends CompositeField { private final IntegerField startAddr; private final ShortIntegerField insnCount; diff --git a/dexlib/src/main/java/org/jf/dexlib/DebugInfoItem.java b/dexlib/src/main/java/org/jf/dexlib/DebugInfoItem.java index 07fa5014..f8ac7411 100644 --- a/dexlib/src/main/java/org/jf/dexlib/DebugInfoItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/DebugInfoItem.java @@ -49,6 +49,8 @@ public class DebugInfoItem extends OffsettedItem { private final FieldListField> parameterNamesField; private final DebugInstructionList debugInstructionListField; + private CodeItem parent = null; + public DebugInfoItem(final DexFile dexFile, int offset) { super(offset); @@ -87,6 +89,10 @@ public class DebugInfoItem extends OffsettedItem { return ItemType.TYPE_DEBUG_INFO_ITEM; } + protected void setParent(CodeItem codeItem) { + this.parent = codeItem; + } + public String getConciseIdentity() { return "debug_info_item @0x" + Integer.toHexString(getOffset()); } @@ -113,6 +119,18 @@ public class DebugInfoItem extends OffsettedItem { return parameterNamesList; } + public int compareTo(DebugInfoItem other) { + if (parent == null) { + if (other.parent == null) { + return 0; + } + return -1; + } + if (other.parent == null) { + return 1; + } + return parent.compareTo(other.parent); + } private class DebugInstructionList implements Field { diff --git a/dexlib/src/main/java/org/jf/dexlib/DexFile.java b/dexlib/src/main/java/org/jf/dexlib/DexFile.java index d50069f6..3a9e89a6 100644 --- a/dexlib/src/main/java/org/jf/dexlib/DexFile.java +++ b/dexlib/src/main/java/org/jf/dexlib/DexFile.java @@ -38,6 +38,7 @@ import java.security.DigestException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; +import java.util.List; import java.util.zip.Adler32; public class DexFile @@ -90,10 +91,10 @@ public class DexFile AnnotationDirectoriesSection, TypeListsSection, StringDataSection, - DebugInfoItemsSection, AnnotationsSection, EncodedArraysSection, - ClassDataSection + ClassDataSection, + DebugInfoItemsSection }; } @@ -135,9 +136,9 @@ public class DexFile ItemType.TYPE_ANNOTATION_SET_REF_LIST.getMapValue(), ItemType.TYPE_ANNOTATIONS_DIRECTORY_ITEM.getMapValue(), ItemType.TYPE_TYPE_LIST.getMapValue(), - ItemType.TYPE_DEBUG_INFO_ITEM.getMapValue(), ItemType.TYPE_CODE_ITEM.getMapValue(), ItemType.TYPE_CLASS_DATA_ITEM.getMapValue(), + ItemType.TYPE_DEBUG_INFO_ITEM.getMapValue(), ItemType.TYPE_MAP_LIST.getMapValue() }; @@ -191,7 +192,7 @@ public class DexFile return forDumping; } - public void place() { + public void place(boolean sort) { int offset = 0; offset = HeaderItemSection.place(offset); @@ -203,6 +204,9 @@ public class DexFile dataOffset = offset; for (OffsettedSection offsettedSection: offsettedSections) { + if (sort) { + offsettedSection.sortSection(); + } offset = offsettedSection.place(offset); } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java b/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java index 9f819c34..19575dab 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java @@ -72,4 +72,8 @@ public class EncodedArrayItem extends OffsettedItem { public ArrayEncodedValueSubField getEncodedArray() { return encodedArray; } + + public int compareTo(EncodedArrayItem encodedArrayItem) { + return encodedArray.compareTo(encodedArrayItem.encodedArray); + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java index fa64f7ad..b12fa70f 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java @@ -54,7 +54,11 @@ public class AnnotationElement extends CompositeField } public int compareTo(AnnotationElement annotationElement) { - return elementName.compareTo(annotationElement.elementName); + int comp = elementName.compareTo(annotationElement.elementName); + if (comp == 0) { + comp = encodedValue.compareTo(annotationElement.encodedValue); + } + return comp; } public StringIdItem getName() { diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java index b8d94625..2f0db126 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java @@ -35,7 +35,7 @@ import java.util.Collections; import java.util.List; public class AnnotationEncodedValueSubField extends CompositeField - implements EncodedValueSubField { + implements EncodedValueSubField, Comparable { private final ArrayList annotationElementList = new ArrayList(); @@ -88,4 +88,25 @@ public class AnnotationEncodedValueSubField extends CompositeField getAnnotationElements() { return Collections.unmodifiableList(annotationElementList); } + + public int compareTo(EncodedValueSubField t) { + int comp = getValueType().compareTo(t.getValueType()); + if (comp == 0) { + AnnotationEncodedValueSubField other = (AnnotationEncodedValueSubField)t; + + comp = annotationType.compareTo(other.annotationType); + if (comp == 0) { + comp = ((Integer)annotationElementList.size()).compareTo(other.annotationElementList.size()); + if (comp == 0) { + for (int i=0; i - implements EncodedValueSubField + implements EncodedValueSubField, Comparable { private final ArrayList encodedValues; @@ -88,4 +88,22 @@ public class ArrayEncodedValueSubField extends CompositeField getValues() { return Collections.unmodifiableList(encodedValues); } + + public int compareTo(EncodedValueSubField t) { + int comp = getValueType().compareTo(t.getValueType()); + if (comp == 0) { + ArrayEncodedValueSubField other = (ArrayEncodedValueSubField)t; + + comp = ((Integer)encodedValues.size()).compareTo(other.encodedValues.size()); + if (comp == 0) { + for (int i=0; i> - implements EncodedValueSubField> { + implements EncodedValueSubField>, Comparable { private int initialValueArg; private ValueType valueType; @@ -140,4 +140,12 @@ public class EncodedIndexedItemReference> return other.item == null; } } + + public int compareTo(EncodedValueSubField t) { + int comp = getValueType().compareTo(t.getValueType()); + if (comp == 0) { + return item.compareTo(((EncodedIndexedItemReference)t).item); + } + return comp; + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValue.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValue.java index badde4e3..4919fd67 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValue.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValue.java @@ -34,7 +34,7 @@ import org.jf.dexlib.Field; import org.jf.dexlib.Util.AnnotatedOutput; import org.jf.dexlib.Util.Input; -public class EncodedValue extends CompositeField { +public class EncodedValue extends CompositeField implements Comparable { private class ValueTypeArgField implements Field { private ValueType valueType; private byte valueArg; @@ -89,7 +89,8 @@ public class EncodedValue extends CompositeField { } } - private class EncodedValueSubFieldWrapper implements Field { + private class EncodedValueSubFieldWrapper + implements Field, Comparable { private final DexFile dexFile; private EncodedValueSubField subField; @@ -141,6 +142,10 @@ public class EncodedValue extends CompositeField { EncodedValueSubFieldWrapper other = (EncodedValueSubFieldWrapper)o; return subField.equals(other.subField); } + + public int compareTo(EncodedValueSubFieldWrapper encodedValueSubFieldWrapper) { + return subField.compareTo(encodedValueSubFieldWrapper.subField); + } } private final ValueTypeArgField valueTypeArg; @@ -181,4 +186,8 @@ public class EncodedValue extends CompositeField { public EncodedValueSubField getValue() { return encodedValue.getEncodedValueSubField(); } + + public int compareTo(EncodedValue encodedValue) { + return this.encodedValue.compareTo(encodedValue.encodedValue); + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValueSubField.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValueSubField.java index b8f7884a..78af5cb4 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValueSubField.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValueSubField.java @@ -35,4 +35,5 @@ public interface EncodedValueSubField extends Fi public void setInitialValueArg(byte valueArg); public byte getValueArg(); public ValueType getValueType(); + public int compareTo(EncodedValueSubField encodedValueSubField); } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/NullEncodedValueSubField.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/NullEncodedValueSubField.java index 559dad72..aafbf70d 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/NullEncodedValueSubField.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/NullEncodedValueSubField.java @@ -32,7 +32,7 @@ import org.jf.dexlib.Util.AnnotatedOutput; import org.jf.dexlib.Util.Input; public class NullEncodedValueSubField - extends SimpleEncodedValueSubField + extends SimpleEncodedValueSubField { public NullEncodedValueSubField() { } @@ -55,4 +55,8 @@ public class NullEncodedValueSubField public ValueType getValueType() { return ValueType.VALUE_NULL; } + + public int compareTo(EncodedValueSubField t) { + return getValueType().compareTo(t.getValueType()); + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/SimpleEncodedValueSubField.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/SimpleEncodedValueSubField.java index 09219279..45d366f3 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/SimpleEncodedValueSubField.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/SimpleEncodedValueSubField.java @@ -30,7 +30,8 @@ package org.jf.dexlib.EncodedValue; import org.jf.dexlib.DexFile; -public abstract class SimpleEncodedValueSubField> implements EncodedValueSubField +public abstract class SimpleEncodedValueSubField, T extends SimpleEncodedValueSubField> + implements EncodedValueSubField, Comparable { protected V value; protected byte valueArg = 0; @@ -65,4 +66,12 @@ public abstract class SimpleEncodedValueSubField)t).value); + } + return comp; + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/IndexedItem.java b/dexlib/src/main/java/org/jf/dexlib/IndexedItem.java index 0b8ff375..593766c0 100644 --- a/dexlib/src/main/java/org/jf/dexlib/IndexedItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/IndexedItem.java @@ -28,7 +28,7 @@ package org.jf.dexlib; -public abstract class IndexedItem extends Item implements Comparable { +public abstract class IndexedItem extends Item { protected IndexedItem(int index) { this.index = index; } diff --git a/dexlib/src/main/java/org/jf/dexlib/IndexedSection.java b/dexlib/src/main/java/org/jf/dexlib/IndexedSection.java index db6cffdf..0cd01af1 100644 --- a/dexlib/src/main/java/org/jf/dexlib/IndexedSection.java +++ b/dexlib/src/main/java/org/jf/dexlib/IndexedSection.java @@ -77,10 +77,6 @@ public abstract class IndexedSection> extends Section { +public abstract class Item implements Comparable { protected int offset = -1; protected int index = -1; diff --git a/dexlib/src/main/java/org/jf/dexlib/Section.java b/dexlib/src/main/java/org/jf/dexlib/Section.java index e2fbbf19..07d216a7 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Section.java +++ b/dexlib/src/main/java/org/jf/dexlib/Section.java @@ -33,6 +33,8 @@ import org.jf.dexlib.Util.Input; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Collections; public abstract class Section { protected ArrayList items; @@ -112,6 +114,10 @@ public abstract class Section { return offset; } + public List getItems() { + return Collections.unmodifiableList(items); + } + protected T getInternedItem(T item) { if (uniqueItems == null) { buildInternedItemMap(); @@ -126,5 +132,9 @@ public abstract class Section { } } + protected void sortSection() { + Collections.sort(items); + } + public abstract T intern(DexFile dexFile, T item); } diff --git a/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java b/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java index a060d728..0d3d7b77 100644 --- a/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java @@ -69,11 +69,17 @@ public class StringDataItem extends OffsettedItem implements Com return value; } + public byte[] getStringBytes() { + return stringByteArray.value; + } + public String getConciseIdentity() { - return "string_data_item: " + getStringValue(); + return "string_data_item: " + Utf8Utils.escapeString(getStringValue()); } public int compareTo(StringDataItem o) { return getStringValue().compareTo(o.getStringValue()); } + + } diff --git a/dexlib/src/main/java/org/jf/dexlib/StringIdItem.java b/dexlib/src/main/java/org/jf/dexlib/StringIdItem.java index a2b709ef..95dd4055 100644 --- a/dexlib/src/main/java/org/jf/dexlib/StringIdItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/StringIdItem.java @@ -28,6 +28,8 @@ package org.jf.dexlib; +import org.jf.dexlib.Util.Utf8Utils; + public class StringIdItem extends IndexedItem { private final OffsettedItemReference stringDataReferenceField; @@ -57,13 +59,17 @@ public class StringIdItem extends IndexedItem { } public String getConciseIdentity() { - return "string_id_item: " + getStringValue(); + return "string_id_item: " + Utf8Utils.escapeString(getStringValue()); } public String getStringValue() { return stringDataReferenceField.getReference().getStringValue(); } + public StringDataItem getStringData() { + return stringDataReferenceField.getReference(); + } + public int compareTo(StringIdItem o) { //sort by the string value return getStringValue().compareTo(o.getStringValue()); diff --git a/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java b/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java index cad9275b..eaa2ec16 100644 --- a/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java @@ -31,7 +31,7 @@ package org.jf.dexlib; import java.util.ArrayList; import java.util.List; -public class TypeListItem extends OffsettedItem implements Comparable { +public class TypeListItem extends OffsettedItem { private final ArrayList> typeList = new ArrayList>(); private final ListSizeField sizeField; diff --git a/dexlib/src/main/java/org/jf/dexlib/Util/NumberUtils.java b/dexlib/src/main/java/org/jf/dexlib/Util/NumberUtils.java index 11155136..644c8b1c 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Util/NumberUtils.java +++ b/dexlib/src/main/java/org/jf/dexlib/Util/NumberUtils.java @@ -66,13 +66,13 @@ public class NumberUtils { } public static long decodeLong(byte[] array, int startIndex) { - return array[startIndex++] | - (array[startIndex++] >> 8) | - (array[startIndex++] >> 16) | - (array[startIndex++] >> 24) | - ((long)array[startIndex++] >> 32) | - ((long)array[startIndex++] >> 40) | - ((long)array[startIndex++] >> 48) | - ((long)array[startIndex++] >> 56); + return (array[startIndex++] & 0xffL) | + ((array[startIndex++] & 0xffL) << 8) | + ((array[startIndex++] & 0xffL) << 16) | + ((array[startIndex++] & 0xffL) << 24) | + ((array[startIndex++] & 0xffL) << 32) | + ((array[startIndex++] & 0xffL) << 40) | + ((array[startIndex++] & 0xffL) << 48) | + ((array[startIndex] & 0xffL) << 56); } } diff --git a/smali/src/main/java/org/jf/smali/smali.java b/smali/src/main/java/org/jf/smali/smali.java index 8df14865..1745c73b 100644 --- a/smali/src/main/java/org/jf/smali/smali.java +++ b/smali/src/main/java/org/jf/smali/smali.java @@ -33,11 +33,13 @@ import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.CommonTreeNodeStream; import org.jf.dexlib.DexFile; +import org.jf.dexlib.AnnotationItem; import org.jf.dexlib.Util.ByteArrayAnnotatedOutput; import java.io.*; import java.util.LinkedHashSet; import java.util.Set; +import java.util.List; public class smali { @@ -125,7 +127,7 @@ public class smali System.exit(1); } - dexFile.place(); + dexFile.place(false); try { ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput();