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 fe260c5f..8efe338c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java @@ -39,6 +39,7 @@ import org.jf.dexlib2.dexbacked.reference.DexBackedFieldReference; import org.jf.dexlib2.dexbacked.reference.DexBackedMethodReference; import org.jf.dexlib2.dexbacked.reference.DexBackedStringReference; import org.jf.dexlib2.dexbacked.reference.DexBackedTypeReference; +import org.jf.dexlib2.dexbacked.util.FixedSizeList; import org.jf.dexlib2.dexbacked.util.FixedSizeSet; import org.jf.dexlib2.iface.DexFile; import org.jf.dexlib2.iface.reference.Reference; @@ -68,6 +69,7 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { private final int methodStartOffset; private final int classCount; private final int classStartOffset; + private final int mapOffset; protected DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) { super(buf, offset); @@ -90,6 +92,7 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { methodStartOffset = readSmallUint(HeaderItem.METHOD_START_OFFSET); classCount = readSmallUint(HeaderItem.CLASS_COUNT_OFFSET); classStartOffset = readSmallUint(HeaderItem.CLASS_START_OFFSET); + mapOffset = readSmallUint(HeaderItem.MAP_OFFSET); } public DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull BaseDexBuffer buf) { @@ -323,6 +326,32 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { return new DexReader(this, offset); } + public List getMapItems() { + final int mapSize = readSmallUint(mapOffset); + + return new FixedSizeList() { + @Override + public MapItem readItem(int index) { + int mapItemOffset = mapOffset + 4 + index * MapItem.ITEM_SIZE; + return new MapItem(DexBackedDexFile.this, mapItemOffset); + } + + @Override public int size() { + return mapSize; + } + }; + } + + @Nullable + public MapItem getMapItemForSection(int itemType) { + for (MapItem mapItem: getMapItems()) { + if (mapItem.getType() == itemType) { + return mapItem; + } + } + return null; + } + public static class NotADexFile extends RuntimeException { public NotADexFile() { } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/RawDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/RawDexFile.java index 204a29d8..33570635 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/RawDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/RawDexFile.java @@ -34,15 +34,12 @@ package org.jf.dexlib2.dexbacked.raw; import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.dexbacked.BaseDexBuffer; import org.jf.dexlib2.dexbacked.DexBackedDexFile; -import org.jf.dexlib2.dexbacked.util.FixedSizeList; import org.jf.dexlib2.util.AnnotatedBytes; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.io.IOException; import java.io.Writer; import java.util.Arrays; -import java.util.List; public class RawDexFile extends DexBackedDexFile { @Nonnull public final HeaderItem headerItem; @@ -62,37 +59,6 @@ public class RawDexFile extends DexBackedDexFile { return Arrays.copyOfRange(getBuf(), getBaseOffset() + start, getBaseOffset() + start + length); } - public int getMapOffset() { - return headerItem.getMapOffset(); - } - - @Nullable - public MapItem getMapItemForSection(int itemType) { - for (MapItem mapItem: getMapItems()) { - if (mapItem.getType() == itemType) { - return mapItem; - } - } - return null; - } - - public List getMapItems() { - final int mapOffset = getMapOffset(); - final int mapSize = readSmallUint(mapOffset); - - return new FixedSizeList() { - @Override - public MapItem readItem(int index) { - int mapItemOffset = mapOffset + 4 + index * MapItem.ITEM_SIZE; - return new MapItem(RawDexFile.this, mapItemOffset); - } - - @Override public int size() { - return mapSize; - } - }; - } - public void writeAnnotations(@Nonnull Writer out, @Nonnull AnnotatedBytes annotatedBytes) throws IOException { // TODO: need to pass in the offset annotatedBytes.writeAnnotations(out, getBuf());