mirror of
https://github.com/revanced/smali.git
synced 2025-05-28 11:50:12 +02:00
Move the map item related methods from RawDexfile to DexBackedDexFile
This commit is contained in:
parent
e3fd1e8115
commit
88ece20f9f
@ -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<MapItem> getMapItems() {
|
||||
final int mapSize = readSmallUint(mapOffset);
|
||||
|
||||
return new FixedSizeList<MapItem>() {
|
||||
@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() {
|
||||
}
|
||||
|
@ -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<MapItem> getMapItems() {
|
||||
final int mapOffset = getMapOffset();
|
||||
final int mapSize = readSmallUint(mapOffset);
|
||||
|
||||
return new FixedSizeList<MapItem>() {
|
||||
@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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user