mirror of
https://github.com/revanced/smali.git
synced 2025-05-19 15:37:06 +02:00
Added API level check to adding methods to vtable.
This commit is contained in:
parent
2206c7638b
commit
64898161b3
@ -55,14 +55,15 @@ public class ClassPath {
|
|||||||
@Nonnull private final TypeProto unknownClass;
|
@Nonnull private final TypeProto unknownClass;
|
||||||
@Nonnull private DexFile[] dexFiles;
|
@Nonnull private DexFile[] dexFiles;
|
||||||
@Nonnull private HashMap<String, TypeProto> loadedClasses = Maps.newHashMap();
|
@Nonnull private HashMap<String, TypeProto> loadedClasses = Maps.newHashMap();
|
||||||
|
@Nonnull private int api;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new ClassPath instance that can load classes from the given dex files
|
* Creates a new ClassPath instance that can load classes from the given dex files
|
||||||
*
|
*
|
||||||
* @param classPath An array of DexFile objects. When loading a class, these dex files will be searched in order
|
* @param classPath An array of DexFile objects. When loading a class, these dex files will be searched in order
|
||||||
*/
|
*/
|
||||||
public ClassPath(DexFile... classPath) throws IOException {
|
public ClassPath(int api, DexFile... classPath) throws IOException {
|
||||||
this(classPath, true);
|
this(api, classPath, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -70,11 +71,11 @@ public class ClassPath {
|
|||||||
*
|
*
|
||||||
* @param classPath An iterable of DexFile objects. When loading a class, these dex files will be searched in order
|
* @param classPath An iterable of DexFile objects. When loading a class, these dex files will be searched in order
|
||||||
*/
|
*/
|
||||||
public ClassPath(Iterable<DexFile> classPath) {
|
public ClassPath(int api, Iterable<DexFile> classPath) {
|
||||||
this(Iterables.toArray(classPath, DexFile.class), false);
|
this(api, Iterables.toArray(classPath, DexFile.class), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClassPath(@Nonnull DexFile[] classPath, boolean copyArray) {
|
private ClassPath(int api, @Nonnull DexFile[] classPath, boolean copyArray) {
|
||||||
if (copyArray) {
|
if (copyArray) {
|
||||||
dexFiles = new DexFile[classPath.length+1];
|
dexFiles = new DexFile[classPath.length+1];
|
||||||
System.arraycopy(classPath, 0, dexFiles, 0, classPath.length);
|
System.arraycopy(classPath, 0, dexFiles, 0, classPath.length);
|
||||||
@ -86,6 +87,7 @@ public class ClassPath {
|
|||||||
|
|
||||||
unknownClass = new UnknownClassProto(this);
|
unknownClass = new UnknownClassProto(this);
|
||||||
loadedClasses.put(unknownClass.getType(), unknownClass);
|
loadedClasses.put(unknownClass.getType(), unknownClass);
|
||||||
|
this.api = api;
|
||||||
|
|
||||||
loadPrimitiveType("Z");
|
loadPrimitiveType("Z");
|
||||||
loadPrimitiveType("B");
|
loadPrimitiveType("B");
|
||||||
@ -150,6 +152,10 @@ public class ClassPath {
|
|||||||
return unknownClass;
|
return unknownClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getApi() {
|
||||||
|
return api;
|
||||||
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile,
|
public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile,
|
||||||
int api) {
|
int api) {
|
||||||
@ -159,7 +165,7 @@ public class ClassPath {
|
|||||||
dexFiles.add(loadClassPathEntry(classPathDirs, classPathEntry, api));
|
dexFiles.add(loadClassPathEntry(classPathDirs, classPathEntry, api));
|
||||||
}
|
}
|
||||||
dexFiles.add(dexFile);
|
dexFiles.add(dexFile);
|
||||||
return new ClassPath(dexFiles);
|
return new ClassPath(api, dexFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Pattern dalvikCacheOdexPattern = Pattern.compile("@([^@]+)@classes.dex$");
|
private static final Pattern dalvikCacheOdexPattern = Pattern.compile("@([^@]+)@classes.dex$");
|
||||||
|
@ -534,7 +534,7 @@ public class ClassProto implements TypeProto {
|
|||||||
for (int i=0; i<vtable.size(); i++) {
|
for (int i=0; i<vtable.size(); i++) {
|
||||||
Method superMethod = vtable.get(i);
|
Method superMethod = vtable.get(i);
|
||||||
if (methodSignaturesMatch(superMethod, virtualMethod)) {
|
if (methodSignaturesMatch(superMethod, virtualMethod)) {
|
||||||
if (canAccess(superMethod)) {
|
if (classPath.getApi() < 17 || canAccess(superMethod)) {
|
||||||
found = true;
|
found = true;
|
||||||
vtable.set(i, virtualMethod);
|
vtable.set(i, virtualMethod);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user