aboutsummaryrefslogtreecommitdiff
path: root/dexlib2/src
diff options
context:
space:
mode:
authorBen Gruver <jesusfreke@jesusfreke.com>2014-12-28 14:49:44 -0800
committerBen Gruver <jesusfreke@jesusfreke.com>2014-12-28 14:49:44 -0800
commit83ec5cf9a3e04df798d7df2eb729fa5f4f0f6f42 (patch)
tree86493bf66d8503762cc4020d3964fcdecbfad4bf /dexlib2/src
parentd83c439ce21af246800f6ca4b184e3a3dee1f08c (diff)
parentd1dbf6b14b1974b3ba6b4199f5eeaf8e20f7c29f (diff)
downloadsmali-83ec5cf9a3e04df798d7df2eb729fa5f4f0f6f42.tar.gz
Merge pull request #25 from yyjdelete/patch-1
checkPackagePrivateAccess only for API 17(4.2)
Diffstat (limited to 'dexlib2/src')
-rw-r--r--dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java30
-rw-r--r--dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java2
2 files changed, 25 insertions, 7 deletions
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 e7081523..b647b2ec 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
@@ -57,7 +57,7 @@ import java.util.regex.Pattern;
public class ClassPath {
@Nonnull private final TypeProto unknownClass;
@Nonnull private HashMap<String, ClassDef> availableClasses = Maps.newHashMap();
- private int api;
+ private boolean checkPackagePrivateAccess;
/**
* Creates a new ClassPath instance that can load classes from the given dex files
@@ -75,12 +75,22 @@ public class ClassPath {
* @param api API level
*/
public ClassPath(@Nonnull Iterable<DexFile> classPath, int api) {
+ this(Lists.newArrayList(classPath), api == 17);
+ }
+
+ /**
+ * Creates a new ClassPath instance that can load classes from the given dex files
+ *
+ * @param classPath An iterable of DexFile objects. When loading a class, these dex files will be searched in order
+ * @param checkPackagePrivateAccess Whether checkPackagePrivateAccess is needed, enabled for ONLY early API 17 by default
+ */
+ public ClassPath(@Nonnull Iterable<DexFile> classPath, boolean checkPackagePrivateAccess) {
// add fallbacks for certain special classes that must be present
Iterable<DexFile> dexFiles = Iterables.concat(classPath, Lists.newArrayList(getBasicClasses()));
unknownClass = new UnknownClassProto(this);
loadedClasses.put(unknownClass.getType(), unknownClass);
- this.api = api;
+ this.checkPackagePrivateAccess = checkPackagePrivateAccess;
loadPrimitiveType("Z");
loadPrimitiveType("B");
@@ -148,20 +158,28 @@ public class ClassPath {
return unknownClass;
}
- public int getApi() {
- return api;
+ public boolean needCheckPackagePrivateAccess() {
+ return checkPackagePrivateAccess;
}
@Nonnull
public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile,
int api) {
+ return fromClassPath(classPathDirs, classPath, dexFile, api, api == 17);
+ }
+
+ @Nonnull
+ public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile,
+ int api, boolean checkPackagePrivateAccess) {
ArrayList<DexFile> dexFiles = Lists.newArrayList();
for (String classPathEntry: classPath) {
- dexFiles.add(loadClassPathEntry(classPathDirs, classPathEntry, api));
+ try {
+ dexFiles.add(loadClassPathEntry(classPathDirs, classPathEntry, api));
+ } catch (ExceptionWithContext e){}
}
dexFiles.add(dexFile);
- return new ClassPath(dexFiles, api);
+ return new ClassPath(dexFiles, checkPackagePrivateAccess);
}
private static final Pattern dalvikCacheOdexPattern = Pattern.compile("@([^@]+)@classes.dex$");
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
index 0665f0c1..350a741e 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
@@ -628,7 +628,7 @@ public class ClassProto implements TypeProto {
for (int i=0; i<vtable.size(); i++) {
Method superMethod = vtable.get(i);
if (methodSignaturesMatch(superMethod, virtualMethod)) {
- if (classPath.getApi() < 17 || canAccess(superMethod)) {
+ if (!classPath.needCheckPackagePrivateAccess() || canAccess(superMethod)) {
if (replaceExisting) {
vtable.set(i, virtualMethod);
}