From 219bdff2d111277386f08dd1cc2b756b58996deb Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sun, 2 Oct 2016 16:05:22 -0700 Subject: [PATCH] Properly implement the art <-> api version map --- .../src/main/java/org/jf/dexlib2/Opcodes.java | 24 ++++++++++--- .../main/java/org/jf/dexlib2/VersionMap.java | 36 +++++++++++++++---- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java index a8368bc1..c1e40ad2 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java @@ -39,6 +39,10 @@ import javax.annotation.Nullable; import java.util.EnumMap; import java.util.HashMap; +import static org.jf.dexlib2.VersionMap.NO_VERSION; +import static org.jf.dexlib2.VersionMap.mapApiToArtVersion; +import static org.jf.dexlib2.VersionMap.mapArtVersionToApi; + public class Opcodes { /** @@ -52,12 +56,12 @@ public class Opcodes { @Nonnull public static Opcodes forApi(int api) { - return new Opcodes(api, VersionMap.mapApiToArtVersion(api)); + return new Opcodes(api, NO_VERSION); } @Nonnull public static Opcodes forArtVersion(int artVersion) { - return new Opcodes(VersionMap.mapArtVersionToApi(artVersion), artVersion); + return new Opcodes(NO_VERSION, artVersion); } /** @@ -70,8 +74,18 @@ public class Opcodes { } private Opcodes(int api, int artVersion) { - this.api = api; - this.artVersion = artVersion; + + + if (api >= 21) { + this.api = api; + this.artVersion = mapApiToArtVersion(api); + } else if (artVersion >= 0 && artVersion < 39) { + this.api = mapArtVersionToApi(artVersion); + this.artVersion = artVersion; + } else { + this.api = api; + this.artVersion = artVersion; + } opcodeValues = new EnumMap(Opcode.class); opcodesByName = Maps.newHashMap(); @@ -131,6 +145,6 @@ public class Opcodes { } public boolean isArt() { - return artVersion != VersionMap.NO_VERSION; + return artVersion != NO_VERSION; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java index 42802bc0..e0e1a6bb 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java @@ -35,16 +35,38 @@ public class VersionMap { public static final int NO_VERSION = -1; public static int mapArtVersionToApi(int artVersion) { - // TODO: implement this - return 20; + if (artVersion >= 79) { + return 24; + } + if (artVersion >= 64) { + return 23; + } + if (artVersion >= 45) { + return 22; + } + if (artVersion >= 39) { + return 21; + } + return 19; } public static int mapApiToArtVersion(int api) { - // TODO: implement this - if (api < 20) { - return NO_VERSION; - } else { - return 56; + switch (api) { + case 19: + case 20: + return 7; + case 21: + return 39; + case 22: + return 45; + case 23: + return 64; + case 24: + return 79; } + if (api > 24) { + return 79; + } + return NO_VERSION; } }