Dex version 37 support

Make dexlib able to read and write version 37 dex files.

Bug: 27809626

Change-Id: I3d0ca6201c7abe7763d2fb925e9ee1edbef24230
This commit is contained in:
Alex Light 2016-04-01 14:24:48 -07:00
parent 87d10dac27
commit 40bbf5c347
2 changed files with 24 additions and 4 deletions

View File

@ -42,9 +42,14 @@ import javax.annotation.Nullable;
public class HeaderItem { public class HeaderItem {
public static final int ITEM_SIZE = 0x70; public static final int ITEM_SIZE = 0x70;
/**
* The magic numbers for dex files.
*
* They are: "dex\n035\0" and "dex\n037\0".
*/
public static final byte[][] MAGIC_VALUES= new byte[][] { public static final byte[][] MAGIC_VALUES= new byte[][] {
new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x35, 0x00}, new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x35, 0x00},
new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x36, 0x00}}; new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x37, 0x00}};
public static final int LITTLE_ENDIAN_TAG = 0x12345678; public static final int LITTLE_ENDIAN_TAG = 0x12345678;
public static final int BIG_ENDIAN_TAG = 0x78563412; public static final int BIG_ENDIAN_TAG = 0x78563412;
@ -225,6 +230,21 @@ public class HeaderItem {
return "Invalid"; return "Invalid";
} }
/**
* Get the higest magic number supported by Android for this api level.
* @return The dex file magic number
*/
public static byte[] getMagicForApi(int api) {
if (api < 24) {
// Prior to Android N we only support dex version 035.
return HeaderItem.MAGIC_VALUES[0];
} else {
// On android N and later we support dex version 037.
return HeaderItem.MAGIC_VALUES[1];
}
}
private static int getVersion(byte[] buf, int offset) { private static int getVersion(byte[] buf, int offset) {
if (buf.length - offset < 8) { if (buf.length - offset < 8) {
return 0; return 0;
@ -241,7 +261,7 @@ public class HeaderItem {
} }
} }
if (matches) { if (matches) {
return i==0?35:36; return i==0?35:37;
} }
} }
return 0; return 0;

View File

@ -1221,8 +1221,8 @@ public abstract class DexWriter<
} }
private void writeHeader(@Nonnull DexDataWriter writer, int dataOffset, int fileSize) throws IOException { private void writeHeader(@Nonnull DexDataWriter writer, int dataOffset, int fileSize) throws IOException {
// always write the 035 version, there's no reason to use the 036 version for now // Write the appropriate header.
writer.write(HeaderItem.MAGIC_VALUES[0]); writer.write(HeaderItem.getMagicForApi(opcodes.api));
// checksum placeholder // checksum placeholder
writer.writeInt(0); writer.writeInt(0);