Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(455)

Side by Side Diff: build/android/incremental_install/java/org/chromium/incrementalinstall/BootstrapApplication.java

Issue 2790453003: Android: Make incremental install work for two <instrumentation> (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.incrementalinstall; 5 package org.chromium.incrementalinstall;
6 6
7 import android.app.Application; 7 import android.app.Application;
8 import android.app.Instrumentation; 8 import android.app.Instrumentation;
9 import android.content.ComponentName; 9 import android.content.ComponentName;
10 import android.content.Context; 10 import android.content.Context;
(...skipping 14 matching lines...) Expand all
25 * after side-loading its .so and .dex files from /data/local/tmp. 25 * after side-loading its .so and .dex files from /data/local/tmp.
26 * 26 *
27 * This class is highly dependent on the private implementation details of 27 * This class is highly dependent on the private implementation details of
28 * Android's ActivityThread.java. However, it has been tested to work with 28 * Android's ActivityThread.java. However, it has been tested to work with
29 * JellyBean through Marshmallow. 29 * JellyBean through Marshmallow.
30 */ 30 */
31 public final class BootstrapApplication extends Application { 31 public final class BootstrapApplication extends Application {
32 private static final String TAG = "cr.incrementalinstall"; 32 private static final String TAG = "cr.incrementalinstall";
33 private static final String MANAGED_DIR_PREFIX = "/data/local/tmp/incrementa l-app-"; 33 private static final String MANAGED_DIR_PREFIX = "/data/local/tmp/incrementa l-app-";
34 private static final String REAL_APP_META_DATA_NAME = "incremental-install-r eal-app"; 34 private static final String REAL_APP_META_DATA_NAME = "incremental-install-r eal-app";
35 private static final String REAL_INSTRUMENTATION_META_DATA_NAME = 35 private static final String REAL_INSTRUMENTATION_META_DATA_NAME0 =
36 "incremental-install-real-instrumentation"; 36 "incremental-install-real-instrumentation-0";
37 private static final String REAL_INSTRUMENTATION_META_DATA_NAME1 =
38 "incremental-install-real-instrumentation-1";
37 39
38 private ClassLoaderPatcher mClassLoaderPatcher; 40 private ClassLoaderPatcher mClassLoaderPatcher;
39 private Application mRealApplication; 41 private Application mRealApplication;
40 private Instrumentation mOrigInstrumentation; 42 private Instrumentation mOrigInstrumentation;
41 private Instrumentation mRealInstrumentation; 43 private Instrumentation mRealInstrumentation;
42 private Object mStashedProviderList; 44 private Object mStashedProviderList;
43 private Object mActivityThread; 45 private Object mActivityThread;
44 46
45 @Override 47 @Override
46 protected void attachBaseContext(Context context) { 48 protected void attachBaseContext(Context context) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 if (isFirstRun && mClassLoaderPatcher.mIsPrimaryProcess) { 108 if (isFirstRun && mClassLoaderPatcher.mIsPrimaryProcess) {
107 LockFile.clearInstallerLock(appFirstRunLockFile); 109 LockFile.clearInstallerLock(appFirstRunLockFile);
108 if (instPackageNameDiffers) { 110 if (instPackageNameDiffers) {
109 LockFile.clearInstallerLock(instFirstRunLockFile); 111 LockFile.clearInstallerLock(instFirstRunLockFile);
110 } 112 }
111 } 113 }
112 114
113 // mInstrumentationAppDir is one of a set of fields that is initiali zed only when 115 // mInstrumentationAppDir is one of a set of fields that is initiali zed only when
114 // instrumentation is active. 116 // instrumentation is active.
115 if (Reflect.getField(mActivityThread, "mInstrumentationAppDir") != n ull) { 117 if (Reflect.getField(mActivityThread, "mInstrumentationAppDir") != n ull) {
116 String realInstrumentationName = 118 String metaDataName = REAL_INSTRUMENTATION_META_DATA_NAME0;
117 getClassNameFromMetadata(REAL_INSTRUMENTATION_META_DATA_ NAME, instContext); 119 if (mOrigInstrumentation instanceof SecondInstrumentation) {
118 initInstrumentation(realInstrumentationName); 120 metaDataName = REAL_INSTRUMENTATION_META_DATA_NAME1;
121 }
122 initInstrumentation(getClassNameFromMetadata(metaDataName, instC ontext));
119 } else { 123 } else {
120 Log.i(TAG, "No instrumentation active."); 124 Log.i(TAG, "No instrumentation active.");
121 } 125 }
122 126
123 // Even when instrumentation is not enabled, ActivityThread uses a d efault 127 // Even when instrumentation is not enabled, ActivityThread uses a d efault
124 // Instrumentation instance internally. We hook it here in order to hook into the 128 // Instrumentation instance internally. We hook it here in order to hook into the
125 // call to Instrumentation.onCreate(). 129 // call to Instrumentation.onCreate().
126 Reflect.setField(mActivityThread, "mInstrumentation", 130 Reflect.setField(mActivityThread, "mInstrumentation",
127 new BootstrapInstrumentation(this)); 131 new BootstrapInstrumentation(this));
128 132
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 for (Map.Entry<String, WeakReference<?>> entry : packageMap.entrySet ()) { 277 for (Map.Entry<String, WeakReference<?>> entry : packageMap.entrySet ()) {
274 Object loadedApk = entry.getValue().get(); 278 Object loadedApk = entry.getValue().get();
275 if (loadedApk != null && Reflect.getField(loadedApk, "mApplicati on") == this) { 279 if (loadedApk != null && Reflect.getField(loadedApk, "mApplicati on") == this) {
276 Reflect.setField(loadedApk, "mApplication", mRealApplication ); 280 Reflect.setField(loadedApk, "mApplication", mRealApplication );
277 Reflect.setField(mRealApplication, "mLoadedApk", loadedApk); 281 Reflect.setField(mRealApplication, "mLoadedApk", loadedApk);
278 } 282 }
279 } 283 }
280 } 284 }
281 } 285 }
282 } 286 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698