Skip to content

Commit b7a1052

Browse files
Huaxin-ggJesusFreke
authored andcommitted
Add support for constructing a DexBackedDexFile from a DexBuffer
1 parent bf65e57 commit b7a1052

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java

+29
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,35 @@ protected DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int o
9898
mapOffset = dexBuffer.readSmallUint(HeaderItem.MAP_OFFSET);
9999
}
100100

101+
protected DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull DexBuffer dexBuffer, @Nonnull DexBuffer dataBuffer, int offset, boolean verifyMagic) {
102+
this.dexBuffer = dexBuffer;
103+
this.dataBuffer = dataBuffer;
104+
105+
byte[] headerBuf = dexBuffer.readByteRange(offset, /* lengthOfHeader= */ 112);
106+
107+
int dexVersion = getVersion(headerBuf, offset, verifyMagic);
108+
109+
if (opcodes == null) {
110+
this.opcodes = getDefaultOpcodes(dexVersion);
111+
} else {
112+
this.opcodes = opcodes;
113+
}
114+
115+
stringCount = dexBuffer.readSmallUint(HeaderItem.STRING_COUNT_OFFSET);
116+
stringStartOffset = dexBuffer.readSmallUint(HeaderItem.STRING_START_OFFSET);
117+
typeCount = dexBuffer.readSmallUint(HeaderItem.TYPE_COUNT_OFFSET);
118+
typeStartOffset = dexBuffer.readSmallUint(HeaderItem.TYPE_START_OFFSET);
119+
protoCount = dexBuffer.readSmallUint(HeaderItem.PROTO_COUNT_OFFSET);
120+
protoStartOffset = dexBuffer.readSmallUint(HeaderItem.PROTO_START_OFFSET);
121+
fieldCount = dexBuffer.readSmallUint(HeaderItem.FIELD_COUNT_OFFSET);
122+
fieldStartOffset = dexBuffer.readSmallUint(HeaderItem.FIELD_START_OFFSET);
123+
methodCount = dexBuffer.readSmallUint(HeaderItem.METHOD_COUNT_OFFSET);
124+
methodStartOffset = dexBuffer.readSmallUint(HeaderItem.METHOD_START_OFFSET);
125+
classCount = dexBuffer.readSmallUint(HeaderItem.CLASS_COUNT_OFFSET);
126+
classStartOffset = dexBuffer.readSmallUint(HeaderItem.CLASS_START_OFFSET);
127+
mapOffset = dexBuffer.readSmallUint(HeaderItem.MAP_OFFSET);
128+
}
129+
101130
/**
102131
* @return The offset that various data offsets are relative to. This is always 0 for a dex file, but may be
103132
* different for other related formats (e.g. cdex).

0 commit comments

Comments
 (0)