diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java index 5ebceef8..54b5be9a 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java @@ -54,6 +54,7 @@ public abstract class DexBackedDexFile extends BaseDexBuffer implements DexFile public abstract int getMethodIdItemOffset(int methodIndex); public abstract int getProtoIdItemOffset(int protoIndex); public abstract int getFieldIdItemOffset(int fieldIndex); + public abstract int getClassDefItemOffset(int classIndex); @Override @Nonnull public abstract DexReader readerAt(int offset); @@ -178,6 +179,7 @@ public abstract class DexBackedDexFile extends BaseDexBuffer implements DexFile return protoStartOffset + protoIndex*ProtoIdItem.ITEM_SIZE; } + @Override public int getClassDefItemOffset(int classIndex) { if (classIndex < 0 || classIndex >= classCount) { throw new ExceptionWithContext("Class index out of bounds: %d", classIndex); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDefItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDefItem.java index 06fa2053..08981ff5 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDefItem.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDefItem.java @@ -33,6 +33,7 @@ package org.jf.dexlib2.dexbacked.raw; import com.google.common.base.Joiner; import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator; import org.jf.dexlib2.util.AnnotatedBytes; @@ -115,4 +116,25 @@ public class ClassDefItem { } }; } + + @Nonnull + public static String asString(@Nonnull DexBackedDexFile dexFile, int classIndex) { + int offset = dexFile.getClassDefItemOffset(classIndex); + int typeIndex = dexFile.readSmallUint(offset + CLASS_OFFSET); + return dexFile.getType(typeIndex); + } + + public static String[] getClasses(@Nonnull RawDexFile dexFile) { + MapItem mapItem = dexFile.getMapItemForSection(ItemType.CLASS_DEF_ITEM); + if (mapItem == null) { + return new String[0]; + } + + int classCount = mapItem.getItemCount(); + String[] ret = new String[classCount]; + for (int i=0; i