Reset class loader after updating instrumentation paths
Bug: 23688983
Change-Id: I9a0f81b422b5e29f3f8707b987e40c65965e0223
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 412e3cd..e15ba74 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4718,7 +4718,13 @@
mInstrumentedSplitAppDirs = data.info.getSplitAppDirs();
mInstrumentedLibDir = data.info.getLibDir();
- ApplicationInfo instrApp = new ApplicationInfo();
+ // The app context's info was created against this thread, but
+ // the class loader may have already been loaded and cached with
+ // outdated paths. Clear it so we can load it again using the
+ // instrumentation paths.
+ data.info.clearClassLoader();
+
+ final ApplicationInfo instrApp = new ApplicationInfo();
instrApp.packageName = ii.packageName;
instrApp.sourceDir = ii.sourceDir;
instrApp.publicSourceDir = ii.publicSourceDir;
@@ -4731,6 +4737,7 @@
ContextImpl instrContext = ContextImpl.createAppContext(this, pi);
try {
+
java.lang.ClassLoader cl = instrContext.getClassLoader();
mInstrumentation = (Instrumentation)
cl.loadClass(data.instrumentationName.getClassName()).newInstance();
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index c2bf28a..3b1c60b 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -255,6 +255,13 @@
return ai.sharedLibraryFiles;
}
+ /** @hide */
+ public void clearClassLoader() {
+ synchronized (this) {
+ mClassLoader = null;
+ }
+ }
+
public ClassLoader getClassLoader() {
synchronized (this) {
if (mClassLoader != null) {