mirror of
https://github.com/revanced/smali.git
synced 2025-05-12 04:14:27 +02:00
Add Opcodes.getDefault
This replace various uses of hardcoded Opcodes.forApi() with Opcodes.getDefault() or other alternatives as applicable
This commit is contained in:
parent
0de5ef0ce7
commit
8f27f45fb1
@ -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);
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ public class ListDexCommand extends Command {
|
||||
List<String> entries;
|
||||
try {
|
||||
MultiDexContainer<? extends DexBackedDexFile> container =
|
||||
DexFileFactory.loadDexContainer(file, Opcodes.forApi(15));
|
||||
DexFileFactory.loadDexContainer(file, Opcodes.getDefault());
|
||||
entries = container.getDexEntryNames();
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
|
@ -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) {
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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) {
|
||||
|
@ -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),
|
||||
|
@ -45,18 +45,6 @@ public class ImmutableDexFile implements DexFile {
|
||||
@Nonnull protected final ImmutableSet<? extends ImmutableClassDef> classes;
|
||||
@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) {
|
||||
this.classes = ImmutableClassDef.immutableSetOf(classes);
|
||||
this.opcodes = opcodes;
|
||||
|
@ -60,18 +60,6 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR
|
||||
|
||||
@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) {
|
||||
BuilderContext context = new BuilderContext();
|
||||
return new DexBuilder(opcodes, context);
|
||||
|
@ -56,17 +56,6 @@ public class DexPool extends DexWriter<CharSequence, StringReference, CharSequen
|
||||
TypeListPool.Key<? extends Collection<? extends CharSequence>>, 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 DexWriter<CharSequence, StringReference, CharSequen
|
||||
classPool, typeListPool, annotationPool, annotationSetPool);
|
||||
}
|
||||
|
||||
public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
|
||||
DexPool dexPool = makeDexPool();
|
||||
public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input)
|
||||
throws IOException {
|
||||
DexPool dexPool = makeDexPool(input.getOpcodes());
|
||||
for (ClassDef classDef: input.getClasses()) {
|
||||
((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 {
|
||||
DexPool dexPool = makeDexPool();
|
||||
DexPool dexPool = makeDexPool(input.getOpcodes());
|
||||
for (ClassDef classDef: input.getClasses()) {
|
||||
((ClassPool)dexPool.classSection).intern(classDef);
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ public class AccessorTest {
|
||||
public void testAccessors() throws IOException {
|
||||
URL url = AccessorTest.class.getClassLoader().getResource("accessorTest.dex");
|
||||
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());
|
||||
|
||||
|
@ -54,7 +54,7 @@ public class CommonSuperclassTest {
|
||||
private final ClassPath classPath;
|
||||
|
||||
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(
|
||||
TestUtils.makeClassDef("Ljava/lang/Object;", null),
|
||||
TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"),
|
||||
|
@ -68,7 +68,7 @@ public class CustomMethodInlineTableTest {
|
||||
ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
|
||||
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(),
|
||||
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,
|
||||
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(),
|
||||
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,
|
||||
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(),
|
||||
ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile);
|
||||
|
@ -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);
|
||||
|
@ -57,7 +57,7 @@ public class SuperclassChainTest {
|
||||
ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>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<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 oneClassProto = classPath.getClass("Ltest/one;");
|
||||
|
@ -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);
|
||||
|
@ -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<Instruction> 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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user