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) {