From 8f27f45fb1d621a6cc5ca01e1eb5cc7dc67cc994 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sun, 25 Sep 2016 20:33:13 -0700 Subject: [PATCH] Add Opcodes.getDefault This replace various uses of hardcoded Opcodes.forApi() with Opcodes.getDefault() or other alternatives as applicable --- .../jf/baksmali/ListDependenciesCommand.java | 2 +- .../java/org/jf/baksmali/ListDexCommand.java | 2 +- .../java/org/jf/baksmali/AnalysisTest.java | 3 ++- .../java/org/jf/dexlib2/DexFileFactory.java | 9 --------- .../src/main/java/org/jf/dexlib2/Opcodes.java | 10 +++++++--- .../org/jf/dexlib2/analysis/ClassPath.java | 2 +- .../jf/dexlib2/immutable/ImmutableDexFile.java | 12 ------------ .../jf/dexlib2/writer/builder/DexBuilder.java | 12 ------------ .../org/jf/dexlib2/writer/pool/DexPool.java | 18 ++++-------------- .../test/java/org/jf/dexlib2/AccessorTest.java | 2 +- .../dexlib2/analysis/CommonSuperclassTest.java | 2 +- .../analysis/CustomMethodInlineTableTest.java | 6 +++--- .../dexlib2/analysis/MethodAnalyzerTest.java | 6 +++--- .../analysis/util/SuperclassChainTest.java | 4 ++-- .../org/jf/dexlib2/writer/DexWriterTest.java | 8 ++++---- .../writer/JumboStringConversionTest.java | 8 ++++---- .../jf/smalidea/psi/impl/SmaliInstruction.java | 2 +- 17 files changed, 35 insertions(+), 73 deletions(-) diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java index f9311b09..636a87c5 100644 --- a/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java +++ b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java @@ -99,7 +99,7 @@ public class ListDependenciesCommand extends Command { } try { - DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(Opcodes.forApi(15), inputStream); + DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(Opcodes.getDefault(), inputStream); for (String entry: odexFile.getDependencies()) { System.out.println(entry); } diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java index dff49f47..d5862eb1 100644 --- a/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java +++ b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java @@ -89,7 +89,7 @@ public class ListDexCommand extends Command { List entries; try { MultiDexContainer container = - DexFileFactory.loadDexContainer(file, Opcodes.forApi(15)); + DexFileFactory.loadDexContainer(file, Opcodes.getDefault()); entries = container.getDexEntryNames(); } catch (IOException ex) { throw new RuntimeException(ex); diff --git a/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java index 9d652e2f..512e1607 100644 --- a/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java @@ -36,6 +36,7 @@ import com.google.common.io.Resources; import junit.framework.Assert; import org.jf.baksmali.Adaptors.ClassDefinition; import org.jf.dexlib2.DexFileFactory; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.analysis.ClassPath; import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.DexFile; @@ -85,7 +86,7 @@ public class AnalysisTest { public void runTest(String test, boolean registerInfo) throws IOException, URISyntaxException { String dexFilePath = String.format("%s%sclasses.dex", test, File.separatorChar); - DexFile dexFile = DexFileFactory.loadDexFile(findResource(dexFilePath)); + DexFile dexFile = DexFileFactory.loadDexFile(findResource(dexFilePath), Opcodes.getDefault()); BaksmaliOptions options = new BaksmaliOptions(); if (registerInfo) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java index e088e872..70a4f8c8 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java @@ -53,21 +53,12 @@ import java.util.List; import java.util.zip.ZipFile; public final class DexFileFactory { - @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull String path) throws IOException { - return loadDexFile(new File(path), Opcodes.forApi(15)); - } @Nonnull public static DexBackedDexFile loadDexFile(@Nonnull String path, @Nonnull Opcodes opcodes) throws IOException { return loadDexFile(new File(path), opcodes); } - @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull File file) throws IOException { - return loadDexFile(file, Opcodes.forApi(15)); - } - /** * Loads a dex/apk/odex/oat file. * diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java index b27e1d71..a8368bc1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java @@ -60,9 +60,13 @@ public class Opcodes { return new Opcodes(VersionMap.mapArtVersionToApi(artVersion), artVersion); } - @Deprecated - public Opcodes(int api) { - this(api, VersionMap.mapApiToArtVersion(api)); + /** + * @return a default Opcodes instance for when the exact Opcodes to use doesn't matter or isn't known + */ + @Nonnull + public static Opcodes getDefault() { + // The last pre-art api + return forApi(20); } private Opcodes(int api, int artVersion) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java index b534c187..0136374c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java @@ -104,7 +104,7 @@ public class ClassPath { private static ClassProvider getBasicClasses() { // fallbacks for some special classes that we assume are present - return new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of( + return new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of( new ReflectionClassDef(Class.class), new ReflectionClassDef(Cloneable.class), new ReflectionClassDef(Object.class), diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java index 2112bd07..76f39a14 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java @@ -45,18 +45,6 @@ public class ImmutableDexFile implements DexFile { @Nonnull protected final ImmutableSet classes; @Nonnull private final Opcodes opcodes; - @Deprecated - public ImmutableDexFile(@Nullable Collection classes) { - this.classes = ImmutableClassDef.immutableSetOf(classes); - this.opcodes = Opcodes.forApi(19); - } - - @Deprecated - public ImmutableDexFile(@Nullable ImmutableSet classes) { - this.classes = ImmutableUtils.nullToEmptySet(classes); - this.opcodes = Opcodes.forApi(19); - } - public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable Collection classes) { this.classes = ImmutableClassDef.immutableSetOf(classes); this.opcodes = opcodes; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java index b7507fa6..cfa7410b 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java @@ -60,18 +60,6 @@ public class DexBuilder extends DexWriter>, Field, PoolMethod, EncodedValue, AnnotationElement> { - @Nonnull - public static DexPool makeDexPool() { - return makeDexPool(Opcodes.forApi(20)); - } - - @Deprecated - @Nonnull - public static DexPool makeDexPool(int api) { - return makeDexPool(Opcodes.forApi(api)); - } - @Nonnull public static DexPool makeDexPool(@Nonnull Opcodes opcodes) { StringPool stringPool = new StringPool(); @@ -91,8 +80,9 @@ public class DexPool extends DexWriterof(), ImmutableList.of(), ImmutableList.of(), dexFile); @@ -97,7 +97,7 @@ public class CustomMethodInlineTableTest { ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, null, ImmutableList.of(method), null); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef)); ClassPathResolver resolver = new ClassPathResolver(ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), dexFile); @@ -126,7 +126,7 @@ public class CustomMethodInlineTableTest { ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, null, ImmutableList.of(method), null); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef)); ClassPathResolver resolver = new ClassPathResolver(ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), dexFile); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java index 8d108ac9..2588d58f 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java @@ -76,7 +76,7 @@ public class MethodAnalyzerTest { AccessFlags.PUBLIC.getValue(), null, methodImplementation); ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, Collections.singletonList(method)); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(15), Collections.singletonList(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef)); ClassPath classPath = new ClassPath(new DexClassProvider(dexFile)); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); @@ -107,7 +107,7 @@ public class MethodAnalyzerTest { AccessFlags.PUBLIC.getValue(), null, methodImplementation); ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, Collections.singletonList(method)); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(15), Collections.singletonList(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef)); ClassPath classPath = new ClassPath(new DexClassProvider(dexFile)); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); @@ -139,7 +139,7 @@ public class MethodAnalyzerTest { AccessFlags.PUBLIC.getValue(), null, methodImplementation); ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, Collections.singletonList(method)); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(15), Collections.singletonList(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef)); ClassPath classPath = new ClassPath(new DexClassProvider(dexFile)); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java index 84cd284b..78bc8a51 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java @@ -57,7 +57,7 @@ public class SuperclassChainTest { ImmutableSet classes = ImmutableSet.of( objectClassDef, oneClassDef, twoClassDef, threeClassDef); - ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), classes))); + ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes))); TypeProto objectClassProto = classPath.getClass("Ljava/lang/Object;"); TypeProto oneClassProto = classPath.getClass("Ltest/one;"); @@ -88,7 +88,7 @@ public class SuperclassChainTest { ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;"); ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;"); ImmutableSet classes = ImmutableSet.of(twoClassDef, threeClassDef); - ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), classes))); + ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes))); TypeProto unknownClassProto = classPath.getUnknownClass(); TypeProto oneClassProto = classPath.getClass("Ltest/one;"); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java index 1a0a2892..bf55e37f 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java @@ -72,12 +72,12 @@ public class DexWriterTest { MemoryDataStore dataStore = new MemoryDataStore(); try { - DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef))); + DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef))); } catch (IOException ex) { throw new RuntimeException(ex); } - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dataStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getData()); ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(dbClassDef); Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null); @@ -112,12 +112,12 @@ public class DexWriterTest { MemoryDataStore dataStore = new MemoryDataStore(); try { - DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef))); + DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef))); } catch (IOException ex) { throw new RuntimeException(ex); } - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dataStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getData()); ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(dbClassDef); Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java index c246e0ec..8ea30a4e 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java @@ -62,7 +62,7 @@ import java.util.List; public class JumboStringConversionTest { @Test public void testJumboStringConversion() throws IOException { - DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15)); + DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.getDefault()); MethodImplementationBuilder methodBuilder = new MethodImplementationBuilder(1); for (int i=0; i<66000; i++) { @@ -92,7 +92,7 @@ public class JumboStringConversionTest { MemoryDataStore dexStore = new MemoryDataStore(); dexBuilder.writeTo(dexStore); - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dexStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getData()); ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(classDef); @@ -122,7 +122,7 @@ public class JumboStringConversionTest { @Test public void testJumboStringConversion_NonMethodBuilder() throws IOException { - DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15)); + DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.getDefault()); final List instructions = Lists.newArrayList(); for (int i=0; i<66000; i++) { @@ -189,7 +189,7 @@ public class JumboStringConversionTest { MemoryDataStore dexStore = new MemoryDataStore(); dexBuilder.writeTo(dexStore); - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dexStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getData()); ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(classDef); diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java index 00931a4a..ecbdbb33 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java @@ -76,7 +76,7 @@ public class SmaliInstruction extends SmaliCompositeElement { assert instructionNode != null; // TODO: put a project level Opcodes instance with the appropriate api level somewhere - opcode = Opcodes.forApi(15).getOpcodeByName(instructionNode.getText()); + opcode = Opcodes.getDefault().getOpcodeByName(instructionNode.getText()); if (opcode == null) { if (instructionNode.getText().equals(".packed-switch")) { return Opcode.PACKED_SWITCH_PAYLOAD;