From 62c103d92a95e5ea52c41bc4c46ed24e4e92a021 Mon Sep 17 00:00:00 2001 From: yyjdelete Date: Fri, 14 Nov 2014 20:50:13 +0800 Subject: checkPackagePrivateAccess only for API 17(4.2) Google revert this for compatibility. see https://android.googlesource.com/platform/dalvik/+/7284c78e14a7aad15b4f1c66c0a18d09a49c00de for details. BTW, it seems that is also disabled for late 4.2 --- dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..30246227 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 Date: Fri, 14 Nov 2014 21:10:11 +0800 Subject: Use options.checkPackagePrivateAccess --- .../src/main/java/org/jf/baksmali/baksmali.java | 2 +- baksmali/src/main/java/org/jf/baksmali/main.java | 2 +- .../java/org/jf/dexlib2/analysis/ClassPath.java | 30 +++++++++++++++++----- .../java/org/jf/dexlib2/analysis/ClassProto.java | 2 +- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmali.java b/baksmali/src/main/java/org/jf/baksmali/baksmali.java index 056ff486..765e77ec 100644 --- a/baksmali/src/main/java/org/jf/baksmali/baksmali.java +++ b/baksmali/src/main/java/org/jf/baksmali/baksmali.java @@ -67,7 +67,7 @@ public class baksmali { options.classPath = ClassPath.fromClassPath(options.bootClassPathDirs, Iterables.concat(options.bootClassPathEntries, extraClassPathEntries), dexFile, - options.apiLevel); + options.apiLevel, options.checkPackagePrivateAccess); if (options.customInlineDefinitions != null) { options.inlineResolver = new CustomInlineMethodResolver(options.classPath, diff --git a/baksmali/src/main/java/org/jf/baksmali/main.java b/baksmali/src/main/java/org/jf/baksmali/main.java index 33d6d250..0d570b57 100644 --- a/baksmali/src/main/java/org/jf/baksmali/main.java +++ b/baksmali/src/main/java/org/jf/baksmali/main.java @@ -241,7 +241,7 @@ public class main { } } - if (options.apiLevel >= 17) { + if (options.apiLevel == 17) { options.checkPackagePrivateAccess = true; } 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 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 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 classPath, boolean checkPackagePrivateAccess) { // add fallbacks for certain special classes that must be present Iterable 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 classPathDirs, Iterable classPath, DexFile dexFile, int api) { + return fromClassPath(classPathDirs, classPath, dexFile, api, api == 17); + } + + @Nonnull + public static ClassPath fromClassPath(Iterable classPathDirs, Iterable classPath, DexFile dexFile, + int api, boolean checkPackagePrivateAccess) { ArrayList 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 30246227..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