Add Opcodes.getDefault

This replace various uses of hardcoded Opcodes.forApi() with
Opcodes.getDefault() or other alternatives as applicable
This commit is contained in:
Ben Gruver 2016-09-25 20:33:13 -07:00
parent 0de5ef0ce7
commit 8f27f45fb1
17 changed files with 35 additions and 73 deletions

View File

@ -99,7 +99,7 @@ public class ListDependenciesCommand extends Command {
} }
try { try {
DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(Opcodes.forApi(15), inputStream); DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(Opcodes.getDefault(), inputStream);
for (String entry: odexFile.getDependencies()) { for (String entry: odexFile.getDependencies()) {
System.out.println(entry); System.out.println(entry);
} }

View File

@ -89,7 +89,7 @@ public class ListDexCommand extends Command {
List<String> entries; List<String> entries;
try { try {
MultiDexContainer<? extends DexBackedDexFile> container = MultiDexContainer<? extends DexBackedDexFile> container =
DexFileFactory.loadDexContainer(file, Opcodes.forApi(15)); DexFileFactory.loadDexContainer(file, Opcodes.getDefault());
entries = container.getDexEntryNames(); entries = container.getDexEntryNames();
} catch (IOException ex) { } catch (IOException ex) {
throw new RuntimeException(ex); throw new RuntimeException(ex);

View File

@ -36,6 +36,7 @@ import com.google.common.io.Resources;
import junit.framework.Assert; import junit.framework.Assert;
import org.jf.baksmali.Adaptors.ClassDefinition; import org.jf.baksmali.Adaptors.ClassDefinition;
import org.jf.dexlib2.DexFileFactory; import org.jf.dexlib2.DexFileFactory;
import org.jf.dexlib2.Opcodes;
import org.jf.dexlib2.analysis.ClassPath; import org.jf.dexlib2.analysis.ClassPath;
import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.ClassDef;
import org.jf.dexlib2.iface.DexFile; import org.jf.dexlib2.iface.DexFile;
@ -85,7 +86,7 @@ public class AnalysisTest {
public void runTest(String test, boolean registerInfo) throws IOException, URISyntaxException { public void runTest(String test, boolean registerInfo) throws IOException, URISyntaxException {
String dexFilePath = String.format("%s%sclasses.dex", test, File.separatorChar); 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(); BaksmaliOptions options = new BaksmaliOptions();
if (registerInfo) { if (registerInfo) {

View File

@ -53,21 +53,12 @@ import java.util.List;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
public final class DexFileFactory { public final class DexFileFactory {
@Nonnull
public static DexBackedDexFile loadDexFile(@Nonnull String path) throws IOException {
return loadDexFile(new File(path), Opcodes.forApi(15));
}
@Nonnull @Nonnull
public static DexBackedDexFile loadDexFile(@Nonnull String path, @Nonnull Opcodes opcodes) throws IOException { public static DexBackedDexFile loadDexFile(@Nonnull String path, @Nonnull Opcodes opcodes) throws IOException {
return loadDexFile(new File(path), opcodes); 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. * Loads a dex/apk/odex/oat file.
* *

View File

@ -60,9 +60,13 @@ public class Opcodes {
return new Opcodes(VersionMap.mapArtVersionToApi(artVersion), artVersion); return new Opcodes(VersionMap.mapArtVersionToApi(artVersion), artVersion);
} }
@Deprecated /**
public Opcodes(int api) { * @return a default Opcodes instance for when the exact Opcodes to use doesn't matter or isn't known
this(api, VersionMap.mapApiToArtVersion(api)); */
@Nonnull
public static Opcodes getDefault() {
// The last pre-art api
return forApi(20);
} }
private Opcodes(int api, int artVersion) { private Opcodes(int api, int artVersion) {

View File

@ -104,7 +104,7 @@ public class ClassPath {
private static ClassProvider getBasicClasses() { private static ClassProvider getBasicClasses() {
// fallbacks for some special classes that we assume are present // 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(Class.class),
new ReflectionClassDef(Cloneable.class), new ReflectionClassDef(Cloneable.class),
new ReflectionClassDef(Object.class), new ReflectionClassDef(Object.class),

View File

@ -45,18 +45,6 @@ public class ImmutableDexFile implements DexFile {
@Nonnull protected final ImmutableSet<? extends ImmutableClassDef> classes; @Nonnull protected final ImmutableSet<? extends ImmutableClassDef> classes;
@Nonnull private final Opcodes opcodes; @Nonnull private final Opcodes opcodes;
@Deprecated
public ImmutableDexFile(@Nullable Collection<? extends ClassDef> classes) {
this.classes = ImmutableClassDef.immutableSetOf(classes);
this.opcodes = Opcodes.forApi(19);
}
@Deprecated
public ImmutableDexFile(@Nullable ImmutableSet<? extends ImmutableClassDef> classes) {
this.classes = ImmutableUtils.nullToEmptySet(classes);
this.opcodes = Opcodes.forApi(19);
}
public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable Collection<? extends ClassDef> classes) { public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable Collection<? extends ClassDef> classes) {
this.classes = ImmutableClassDef.immutableSetOf(classes); this.classes = ImmutableClassDef.immutableSetOf(classes);
this.opcodes = opcodes; this.opcodes = opcodes;

View File

@ -60,18 +60,6 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR
@Nonnull private final BuilderContext context; @Nonnull private final BuilderContext context;
@Nonnull public static DexBuilder makeDexBuilder() {
BuilderContext context = new BuilderContext();
return new DexBuilder(Opcodes.forApi(20), context);
}
@Deprecated
@Nonnull
public static DexBuilder makeDexBuilder(int api) {
BuilderContext context = new BuilderContext();
return new DexBuilder(Opcodes.forApi(api), context);
}
@Nonnull public static DexBuilder makeDexBuilder(@Nonnull Opcodes opcodes) { @Nonnull public static DexBuilder makeDexBuilder(@Nonnull Opcodes opcodes) {
BuilderContext context = new BuilderContext(); BuilderContext context = new BuilderContext();
return new DexBuilder(opcodes, context); return new DexBuilder(opcodes, context);

View File

@ -56,17 +56,6 @@ public class DexPool extends DexWriter<CharSequence, StringReference, CharSequen
TypeListPool.Key<? extends Collection<? extends CharSequence>>, Field, PoolMethod, TypeListPool.Key<? extends Collection<? extends CharSequence>>, Field, PoolMethod,
EncodedValue, AnnotationElement> { 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 @Nonnull
public static DexPool makeDexPool(@Nonnull Opcodes opcodes) { public static DexPool makeDexPool(@Nonnull Opcodes opcodes) {
StringPool stringPool = new StringPool(); StringPool stringPool = new StringPool();
@ -91,8 +80,9 @@ public class DexPool extends DexWriter<CharSequence, StringReference, CharSequen
classPool, typeListPool, annotationPool, annotationSetPool); classPool, typeListPool, annotationPool, annotationSetPool);
} }
public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException { public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input)
DexPool dexPool = makeDexPool(); throws IOException {
DexPool dexPool = makeDexPool(input.getOpcodes());
for (ClassDef classDef: input.getClasses()) { for (ClassDef classDef: input.getClasses()) {
((ClassPool)dexPool.classSection).intern(classDef); ((ClassPool)dexPool.classSection).intern(classDef);
} }
@ -100,7 +90,7 @@ public class DexPool extends DexWriter<CharSequence, StringReference, CharSequen
} }
public static void writeTo(@Nonnull String path, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException { public static void writeTo(@Nonnull String path, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
DexPool dexPool = makeDexPool(); DexPool dexPool = makeDexPool(input.getOpcodes());
for (ClassDef classDef: input.getClasses()) { for (ClassDef classDef: input.getClasses()) {
((ClassPool)dexPool.classSection).intern(classDef); ((ClassPool)dexPool.classSection).intern(classDef);
} }

View File

@ -79,7 +79,7 @@ public class AccessorTest {
public void testAccessors() throws IOException { public void testAccessors() throws IOException {
URL url = AccessorTest.class.getClassLoader().getResource("accessorTest.dex"); URL url = AccessorTest.class.getClassLoader().getResource("accessorTest.dex");
Assert.assertNotNull(url); Assert.assertNotNull(url);
DexFile f = DexFileFactory.loadDexFile(url.getFile()); DexFile f = DexFileFactory.loadDexFile(url.getFile(), Opcodes.getDefault());
SyntheticAccessorResolver sar = new SyntheticAccessorResolver(f.getOpcodes(), f.getClasses()); SyntheticAccessorResolver sar = new SyntheticAccessorResolver(f.getOpcodes(), f.getClasses());

View File

@ -54,7 +54,7 @@ public class CommonSuperclassTest {
private final ClassPath classPath; private final ClassPath classPath;
public CommonSuperclassTest() throws IOException { public CommonSuperclassTest() throws IOException {
classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(),
ImmutableSet.of( ImmutableSet.of(
TestUtils.makeClassDef("Ljava/lang/Object;", null), TestUtils.makeClassDef("Ljava/lang/Object;", null),
TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"), TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"),

View File

@ -68,7 +68,7 @@ public class CustomMethodInlineTableTest {
ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
null, null, null, null, null, ImmutableList.of(method)); null, null, null, null, null, ImmutableList.of(method));
DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef));
ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(), ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile); ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile);
@ -97,7 +97,7 @@ public class CustomMethodInlineTableTest {
ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
null, null, null, null, ImmutableList.of(method), 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.<String>of(), ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile); ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile);
@ -126,7 +126,7 @@ public class CustomMethodInlineTableTest {
ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
null, null, null, null, ImmutableList.of(method), 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.<String>of(), ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile); ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile);

View File

@ -76,7 +76,7 @@ public class MethodAnalyzerTest {
AccessFlags.PUBLIC.getValue(), null, methodImplementation); AccessFlags.PUBLIC.getValue(), null, methodImplementation);
ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
null, null, null, Collections.singletonList(method)); 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)); ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
@ -107,7 +107,7 @@ public class MethodAnalyzerTest {
AccessFlags.PUBLIC.getValue(), null, methodImplementation); AccessFlags.PUBLIC.getValue(), null, methodImplementation);
ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
null, null, null, Collections.singletonList(method)); 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)); ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
@ -139,7 +139,7 @@ public class MethodAnalyzerTest {
AccessFlags.PUBLIC.getValue(), null, methodImplementation); AccessFlags.PUBLIC.getValue(), null, methodImplementation);
ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
null, null, null, Collections.singletonList(method)); 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)); ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);

View File

@ -57,7 +57,7 @@ public class SuperclassChainTest {
ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of( ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of(
objectClassDef, oneClassDef, twoClassDef, threeClassDef); 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 objectClassProto = classPath.getClass("Ljava/lang/Object;");
TypeProto oneClassProto = classPath.getClass("Ltest/one;"); TypeProto oneClassProto = classPath.getClass("Ltest/one;");
@ -88,7 +88,7 @@ public class SuperclassChainTest {
ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;"); ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;");
ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;"); ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;");
ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of(twoClassDef, threeClassDef); ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>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 unknownClassProto = classPath.getUnknownClass();
TypeProto oneClassProto = classPath.getClass("Ltest/one;"); TypeProto oneClassProto = classPath.getClass("Ltest/one;");

View File

@ -72,12 +72,12 @@ public class DexWriterTest {
MemoryDataStore dataStore = new MemoryDataStore(); MemoryDataStore dataStore = new MemoryDataStore();
try { 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) { } catch (IOException ex) {
throw new RuntimeException(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); ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null);
Assert.assertNotNull(dbClassDef); Assert.assertNotNull(dbClassDef);
Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null); Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null);
@ -112,12 +112,12 @@ public class DexWriterTest {
MemoryDataStore dataStore = new MemoryDataStore(); MemoryDataStore dataStore = new MemoryDataStore();
try { 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) { } catch (IOException ex) {
throw new RuntimeException(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); ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null);
Assert.assertNotNull(dbClassDef); Assert.assertNotNull(dbClassDef);
Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null); Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null);

View File

@ -62,7 +62,7 @@ import java.util.List;
public class JumboStringConversionTest { public class JumboStringConversionTest {
@Test @Test
public void testJumboStringConversion() throws IOException { public void testJumboStringConversion() throws IOException {
DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15)); DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.getDefault());
MethodImplementationBuilder methodBuilder = new MethodImplementationBuilder(1); MethodImplementationBuilder methodBuilder = new MethodImplementationBuilder(1);
for (int i=0; i<66000; i++) { for (int i=0; i<66000; i++) {
@ -92,7 +92,7 @@ public class JumboStringConversionTest {
MemoryDataStore dexStore = new MemoryDataStore(); MemoryDataStore dexStore = new MemoryDataStore();
dexBuilder.writeTo(dexStore); 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); ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null);
Assert.assertNotNull(classDef); Assert.assertNotNull(classDef);
@ -122,7 +122,7 @@ public class JumboStringConversionTest {
@Test @Test
public void testJumboStringConversion_NonMethodBuilder() throws IOException { public void testJumboStringConversion_NonMethodBuilder() throws IOException {
DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15)); DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.getDefault());
final List<Instruction> instructions = Lists.newArrayList(); final List<Instruction> instructions = Lists.newArrayList();
for (int i=0; i<66000; i++) { for (int i=0; i<66000; i++) {
@ -189,7 +189,7 @@ public class JumboStringConversionTest {
MemoryDataStore dexStore = new MemoryDataStore(); MemoryDataStore dexStore = new MemoryDataStore();
dexBuilder.writeTo(dexStore); 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); ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null);
Assert.assertNotNull(classDef); Assert.assertNotNull(classDef);

View File

@ -76,7 +76,7 @@ public class SmaliInstruction extends SmaliCompositeElement {
assert instructionNode != null; assert instructionNode != null;
// TODO: put a project level Opcodes instance with the appropriate api level somewhere // 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 (opcode == null) {
if (instructionNode.getText().equals(".packed-switch")) { if (instructionNode.getText().equals(".packed-switch")) {
return Opcode.PACKED_SWITCH_PAYLOAD; return Opcode.PACKED_SWITCH_PAYLOAD;