diff --git a/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java b/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java index 5108f6ec..1984c3a2 100644 --- a/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java @@ -96,13 +96,21 @@ public class ClassDataItem extends OffsettedItem { public int addField(EncodedField encodedField) { if (encodedField.isStatic()) { - staticFieldList.add(encodedField); - Collections.sort(staticFieldList); - return Collections.binarySearch(staticFieldList, encodedField); + int index = Collections.binarySearch(staticFieldList, encodedField); + if (index >= 0) { + throw new RuntimeException("A static field of that name and type is already present"); + } + index = (index + 1) * -1; + staticFieldList.add(index, encodedField); + return index; } else { - instanceFieldList.add(encodedField); - Collections.sort(instanceFieldList); - return Collections.binarySearch(instanceFieldList, encodedField); + int index = Collections.binarySearch(instanceFieldList, encodedField); + if (index >= 0) { + throw new RuntimeException("An instance field of that name and type is already present"); + } + index = (index + 1) * -1; + instanceFieldList.add(index, encodedField); + return index; } } diff --git a/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java b/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java index dd9032dc..cb5ff19f 100644 --- a/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java @@ -146,6 +146,10 @@ public class ClassDefItem extends IndexedItem { return classTypeReferenceField.equals(other.classTypeReferenceField); } + public EncodedArrayItem getStaticInitializers() { + return staticFieldInitialValuesReferenceField.getReference(); + } + public int compareTo(ClassDefItem o) { //sorting is implemented in SortClassDefItemSection, so this class doesn't //need an implementation of compareTo @@ -180,6 +184,11 @@ public class ClassDefItem extends IndexedItem { } staticFieldInitialValuesList.add(fieldIndex, initialValue); + } else if (staticFieldInitialValuesList != null && encodedField.isStatic() && fieldIndex < staticFieldInitialValuesList.size()) { + EncodedValueSubField subField = TypeUtils.makeDefaultValueForType(dexFile, + encodedField.getFieldReference().getFieldType().getTypeDescriptor()); + EncodedValue encodedValue = new EncodedValue(dexFile, subField); + staticFieldInitialValuesList.add(fieldIndex, encodedValue); } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java b/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java index 11cae1a0..37e69705 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedArrayItem.java @@ -35,6 +35,7 @@ import org.jf.dexlib.util.Input; import org.jf.dexlib.util.AnnotatedOutput; import java.util.ArrayList; +import java.util.List; public class EncodedArrayItem extends OffsettedItem { private final ArrayEncodedValueSubField encodedArray; @@ -86,4 +87,8 @@ public class EncodedArrayItem extends OffsettedItem { public String getConciseIdentity() { return "encoded_array @0x" + Integer.toHexString(getOffset()); } + + public ArrayEncodedValueSubField getEncodedArray() { + return encodedArray; + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/ArrayEncodedValueSubField.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/ArrayEncodedValueSubField.java index 976399de..84d15137 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/ArrayEncodedValueSubField.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/ArrayEncodedValueSubField.java @@ -31,6 +31,7 @@ package org.jf.dexlib.EncodedValue; import org.jf.dexlib.*; import java.util.ArrayList; +import java.util.List; public class ArrayEncodedValueSubField extends CompositeField implements EncodedValueSubField @@ -82,4 +83,8 @@ public class ArrayEncodedValueSubField extends CompositeField getValues() { + return (List)encodedValues.clone(); + } } 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 b04cdec6..82a31cc9 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValue.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/EncodedValue.java @@ -175,4 +175,8 @@ public class EncodedValue extends CompositeField { public byte getValueArg() { return valueTypeArg.getValueArg(); } + + public EncodedValueSubField getValue() { + return encodedValue.getEncodedValueSubField(); + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/IntEncodedValueSubField.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/IntEncodedValueSubField.java index 0837be90..a7aa9f4d 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/IntEncodedValueSubField.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/IntEncodedValueSubField.java @@ -36,6 +36,7 @@ public class IntEncodedValueSubField extends SimpleEncodedValueSubField { public IntEncodedValueSubField() { + return; } public IntEncodedValueSubField(int value) {