summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrett Chabot <brettchabot@google.com>2018-10-19 08:10:29 -0700
committerandroid-build-merger <android-build-merger@google.com>2018-10-19 08:10:29 -0700
commit5acc1d876e767331143fd3b20f6583405e705d7c (patch)
treee172c1ca0ecfb7e2e67c0429bf972abe0eb64622
parentb0ba9b90075ed97e9a1af4b536d91f733a17f054 (diff)
parent15bbdce417930becc8f2d224051c54421ada0755 (diff)
downloadmultidex-5acc1d876e767331143fd3b20f6583405e705d7c.tar.gz
Merge "Fix compatibility with Robolectric." am: 8845f3212e am: 5255f14314
am: 15bbdce417 Change-Id: I73c74d4005470087040a49c9ec1b20e48041b32c
-rw-r--r--library/Android.bp3
-rw-r--r--library/src/androidx/multidex/MultiDex.java57
2 files changed, 39 insertions, 21 deletions
diff --git a/library/Android.bp b/library/Android.bp
index bc82325..6ba5804 100644
--- a/library/Android.bp
+++ b/library/Android.bp
@@ -31,7 +31,8 @@ genrule {
java_library_static {
name: "android-support-multidex",
- sdk_version: "4",
+ sdk_version: "15",
+ min_sdk_version: "4",
srcs: [
"src/**/*.java",
],
diff --git a/library/src/androidx/multidex/MultiDex.java b/library/src/androidx/multidex/MultiDex.java
index 69ff889..30cb886 100644
--- a/library/src/androidx/multidex/MultiDex.java
+++ b/library/src/androidx/multidex/MultiDex.java
@@ -22,7 +22,9 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.os.Build;
import android.util.Log;
+
import dalvik.system.DexFile;
+
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Array;
@@ -218,28 +220,11 @@ public final class MultiDex {
+ System.getProperty("java.vm.version") + "\"");
}
- /* The patched class loader is expected to be a descendant of
- * dalvik.system.BaseDexClassLoader. We modify its
- * dalvik.system.DexPathList pathList field to append additional DEX
- * file entries.
+ /* The patched class loader is expected to be a ClassLoader capable of loading DEX
+ * bytecode. We modify its pathList field to append additional DEX file entries.
*/
- ClassLoader loader;
- try {
- loader = mainContext.getClassLoader();
- } catch (RuntimeException e) {
- /* Ignore those exceptions so that we don't break tests relying on Context like
- * a android.test.mock.MockContext or a android.content.ContextWrapper with a
- * null base Context.
- */
- Log.w(TAG, "Failure while trying to obtain Context class loader. " +
- "Must be running in test mode. Skip patching.", e);
- return;
- }
+ ClassLoader loader = getDexClassloader(mainContext);
if (loader == null) {
- // Note, the context class loader is null when running Robolectric tests.
- Log.e(TAG,
- "Context class loader is null. Must be running in test mode. "
- + "Skip patching.");
return;
}
@@ -286,6 +271,38 @@ public final class MultiDex {
}
}
+ /**
+ * Returns a {@link Classloader} from the {@link Context} that is capable of reading dex
+ * bytecode or null if the Classloader is not dex-capable e.g: when running on a JVM testing
+ * environment such as Robolectric.
+ */
+ private static ClassLoader getDexClassloader(Context context) {
+ ClassLoader loader;
+ try {
+ loader = context.getClassLoader();
+ } catch (RuntimeException e) {
+ /* Ignore those exceptions so that we don't break tests relying on Context like
+ * a android.test.mock.MockContext or a android.content.ContextWrapper with a
+ * null base Context.
+ */
+ Log.w(TAG, "Failure while trying to obtain Context class loader. "
+ + "Must be running in test mode. Skip patching.", e);
+ return null;
+ }
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ if (loader instanceof dalvik.system.BaseDexClassLoader) {
+ return loader;
+ }
+ } else if (loader instanceof dalvik.system.DexClassLoader
+ || loader instanceof dalvik.system.PathClassLoader) {
+ return loader;
+ }
+ Log.e(TAG, "Context class loader is null or not dex-capable. "
+ + "Must be running in test mode. Skip patching.");
+ return null;
+ }
+
private static ApplicationInfo getApplicationInfo(Context context) {
try {
/* Due to package install races it is possible for a process to be started from an old