aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gruver <jesusfreke@jesusfreke.com>2016-04-04 11:11:49 -0700
committerBen Gruver <jesusfreke@jesusfreke.com>2016-04-04 11:11:49 -0700
commit7fd5f88caf7fbb1c2f67b4ef993e11195a5e0a73 (patch)
treec2ad99c7d97bf6f0ca071e87a775e5d806a27c08
parent87d10dac2773cd35b7d5825d7957206e26c1727b (diff)
parent40bbf5c347fde4ccba4b1875e63e94a84354b7af (diff)
downloadsmali-7fd5f88caf7fbb1c2f67b4ef993e11195a5e0a73.tar.gz
Merge pull request #391 from allight/new-dex-version
Dex version 37 support
-rw-r--r--dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java24
-rw-r--r--dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java4
2 files changed, 24 insertions, 4 deletions
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
index 3499eadc..531ff461 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
@@ -42,9 +42,14 @@ import javax.annotation.Nullable;
public class HeaderItem {
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[][] {
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 BIG_ENDIAN_TAG = 0x78563412;
@@ -225,6 +230,21 @@ public class HeaderItem {
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) {
if (buf.length - offset < 8) {
return 0;
@@ -241,7 +261,7 @@ public class HeaderItem {
}
}
if (matches) {
- return i==0?35:36;
+ return i==0?35:37;
}
}
return 0;
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
index 9d353982..4e81f7fa 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
@@ -1221,8 +1221,8 @@ public abstract class DexWriter<
}
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
- writer.write(HeaderItem.MAGIC_VALUES[0]);
+ // Write the appropriate header.
+ writer.write(HeaderItem.getMagicForApi(opcodes.api));
// checksum placeholder
writer.writeInt(0);