Loading core/java/android/app/ActivityThread.java +13 −29 Original line number Diff line number Diff line Loading @@ -152,7 +152,7 @@ public final class ActivityThread { private static final int LOG_ON_PAUSE_CALLED = 30021; private static final int LOG_ON_RESUME_CALLED = 30022; static ContextImpl mSystemContext = null; private ContextImpl mSystemContext; static IPackageManager sPackageManager; Loading Loading @@ -1645,7 +1645,7 @@ public final class ActivityThread { ? mBoundApplication.processName : null) + ")"); packageInfo = new LoadedApk(this, aInfo, compatInfo, this, baseLoader, new LoadedApk(this, aInfo, compatInfo, baseLoader, securityViolation, includeCode && (aInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0); if (includeCode) { Loading Loading @@ -1698,26 +1698,15 @@ public final class ActivityThread { public ContextImpl getSystemContext() { synchronized (this) { if (mSystemContext == null) { ContextImpl context = ContextImpl.createSystemContext(this); LoadedApk info = new LoadedApk(this, "android", context, null, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO); context.init(info, null, this); context.getResources().updateConfiguration(mResourcesManager.getConfiguration(), mResourcesManager.getDisplayMetricsLocked(Display.DEFAULT_DISPLAY)); mSystemContext = context; //Slog.i(TAG, "Created system resources " + context.getResources() // + ": " + context.getResources().getConfiguration()); } mSystemContext = ContextImpl.createSystemContext(this); } return mSystemContext; } } public void installSystemApplicationInfo(ApplicationInfo info) { synchronized (this) { ContextImpl context = getSystemContext(); context.init(new LoadedApk(this, "android", context, info, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO), null, this); getSystemContext().installSystemApplicationInfo(info); // give ourselves a default profiler mProfiler = new Profiler(); Loading Loading @@ -2203,8 +2192,7 @@ public final class ActivityThread { private Context createBaseContextForActivity(ActivityClientRecord r, final Activity activity) { ContextImpl appContext = new ContextImpl(); appContext.init(r.packageInfo, r.token, this); ContextImpl appContext = ContextImpl.createActivityContext(this, r.packageInfo, r.token); appContext.setOuterContext(activity); // For debugging purposes, if the activity's package name contains the value of Loading Loading @@ -2489,8 +2477,7 @@ public final class ActivityThread { agent = (BackupAgent) cl.loadClass(classname).newInstance(); // set up the agent's context ContextImpl context = new ContextImpl(); context.init(packageInfo, null, this); ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(agent); agent.attach(context); Loading Loading @@ -2562,11 +2549,10 @@ public final class ActivityThread { try { if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name); ContextImpl context = new ContextImpl(); context.init(packageInfo, null, this); ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(service); Application app = packageInfo.makeApplication(false, mInstrumentation); context.setOuterContext(service); service.attach(context, this, data.info.name, data.token, app, ActivityManagerNative.getDefault()); service.onCreate(); Loading Loading @@ -4162,8 +4148,7 @@ public final class ActivityThread { } updateDefaultDensity(); final ContextImpl appContext = new ContextImpl(); appContext.init(data.info, null, this); final ContextImpl appContext = ContextImpl.createAppContext(this, data.info); if (!Process.isIsolated()) { final File cacheDir = appContext.getCacheDir(); Loading Loading @@ -4274,8 +4259,7 @@ public final class ActivityThread { instrApp.nativeLibraryDir = ii.nativeLibraryDir; LoadedApk pi = getPackageInfo(instrApp, data.compatInfo, appContext.getClassLoader(), false, true); ContextImpl instrContext = new ContextImpl(); instrContext.init(pi, null, this); ContextImpl instrContext = ContextImpl.createAppContext(this, pi); try { java.lang.ClassLoader cl = instrContext.getClassLoader(); Loading Loading @@ -4890,8 +4874,8 @@ public final class ActivityThread { UserHandle.myUserId()); try { mInstrumentation = new Instrumentation(); ContextImpl context = new ContextImpl(); context.init(getSystemContext().mPackageInfo, null, this); ContextImpl context = ContextImpl.createAppContext( this, getSystemContext().mPackageInfo); Application app = Instrumentation.newApplication(Application.class, context); mAllApplications.add(app); mInitialApplication = app; Loading core/java/android/app/ContextImpl.java +95 −103 Original line number Diff line number Diff line Loading @@ -183,22 +183,31 @@ class ContextImpl extends Context { */ private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs; /*package*/ LoadedApk mPackageInfo; private String mBasePackageName; private String mOpPackageName; private Resources mResources; /*package*/ ActivityThread mMainThread; final ActivityThread mMainThread; final LoadedApk mPackageInfo; private final IBinder mActivityToken; private final UserHandle mUser; private final ApplicationContentResolver mContentResolver; private final String mBasePackageName; private final String mOpPackageName; private final ResourcesManager mResourcesManager; private final Resources mResources; private final Display mDisplay; // may be null if default display private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); private final Configuration mOverrideConfiguration; private final boolean mRestricted; private Context mOuterContext; private IBinder mActivityToken = null; private ApplicationContentResolver mContentResolver; private int mThemeResource = 0; private Resources.Theme mTheme = null; private PackageManager mPackageManager; private Display mDisplay; // may be null if default display private Context mReceiverRestrictedContext = null; private boolean mRestricted; private UserHandle mUser; private ResourcesManager mResourcesManager; private final Object mSync = new Object(); Loading @@ -220,8 +229,6 @@ class ContextImpl extends Context { private static final String[] EMPTY_FILE_LIST = {}; final private DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); /** * Override this class when the system service constructor needs a * ContextImpl. Else, use StaticServiceFetcher below. Loading Loading @@ -1879,20 +1886,17 @@ class ContextImpl extends Context { @Override public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) throws NameNotFoundException { final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; if (packageName.equals("system") || packageName.equals("android")) { final ContextImpl context = new ContextImpl(mMainThread.getSystemContext()); context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user); return context; return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, user, restricted, mDisplay, mOverrideConfiguration); } LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags, user.getIdentifier()); LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags, user.getIdentifier()); if (pi != null) { ContextImpl c = new ContextImpl(); c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; c.init(pi, null, mMainThread, mResources, mBasePackageName, user); ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, user, restricted, mDisplay, mOverrideConfiguration); if (c.mResources != null) { return c; } Loading @@ -1909,12 +1913,8 @@ class ContextImpl extends Context { throw new IllegalArgumentException("overrideConfiguration must not be null"); } ContextImpl c = new ContextImpl(); c.init(mPackageInfo, null, mMainThread); c.mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(), getDisplayId(), overrideConfiguration, mResources.getCompatibilityInfo(), mActivityToken); return c; return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, mUser, mRestricted, mDisplay, overrideConfiguration); } @Override Loading @@ -1923,15 +1923,8 @@ class ContextImpl extends Context { throw new IllegalArgumentException("display must not be null"); } int displayId = display.getDisplayId(); ContextImpl context = new ContextImpl(); context.init(mPackageInfo, null, mMainThread); context.mDisplay = display; DisplayAdjustments daj = getDisplayAdjustments(displayId); context.mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(), displayId, null, daj.getCompatibilityInfo(), null); return context; return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, mUser, mRestricted, display, mOverrideConfiguration); } private int getDisplayId() { Loading Loading @@ -1973,43 +1966,76 @@ class ContextImpl extends Context { } static ContextImpl createSystemContext(ActivityThread mainThread) { final ContextImpl context = new ContextImpl(); context.init(Resources.getSystem(), mainThread, Process.myUserHandle()); LoadedApk packageInfo = new LoadedApk(mainThread); ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, false, null, null); context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), context.mResourcesManager.getDisplayMetricsLocked(Display.DEFAULT_DISPLAY)); return context; } ContextImpl() { mOuterContext = this; static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) { if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); return new ContextImpl(null, mainThread, packageInfo, null, null, false, null, null); } /** * Create a new ApplicationContext from an existing one. The new one * works and operates the same as the one it is copying. * * @param context Existing application context. */ public ContextImpl(ContextImpl context) { mPackageInfo = context.mPackageInfo; mBasePackageName = context.mBasePackageName; mOpPackageName = context.mOpPackageName; mResources = context.mResources; mMainThread = context.mMainThread; mContentResolver = context.mContentResolver; mUser = context.mUser; mDisplay = context.mDisplay; mOuterContext = this; mDisplayAdjustments.setCompatibilityInfo(mPackageInfo.getCompatibilityInfo()); static ContextImpl createActivityContext(ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken) { if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); if (activityToken == null) throw new IllegalArgumentException("activityInfo"); return new ContextImpl(null, mainThread, packageInfo, activityToken, null, false, null, null); } final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) { init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle()); private ContextImpl(ContextImpl container, ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted, Display display, Configuration overrideConfiguration) { mOuterContext = this; mMainThread = mainThread; mActivityToken = activityToken; mRestricted = restricted; if (user == null) { user = Process.myUserHandle(); } mUser = user; final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread, Resources container, String basePackageName, UserHandle user) { mPackageInfo = packageInfo; if (basePackageName != null) { mBasePackageName = mOpPackageName = basePackageName; mContentResolver = new ApplicationContentResolver(this, mainThread, user); mResourcesManager = ResourcesManager.getInstance(); mDisplay = display; mOverrideConfiguration = overrideConfiguration; final int displayId = getDisplayId(); CompatibilityInfo compatInfo = null; if (container != null) { compatInfo = container.getDisplayAdjustments(displayId).getCompatibilityInfo(); } if (compatInfo == null && displayId == Display.DEFAULT_DISPLAY) { compatInfo = packageInfo.getCompatibilityInfo(); } mDisplayAdjustments.setCompatibilityInfo(compatInfo); mDisplayAdjustments.setActivityToken(activityToken); Resources resources = packageInfo.getResources(mainThread); if (resources != null) { if (activityToken != null || displayId != Display.DEFAULT_DISPLAY || overrideConfiguration != null || (compatInfo != null && compatInfo.applicationScale != resources.getCompatibilityInfo().applicationScale)) { resources = mResourcesManager.getTopLevelResources( packageInfo.getResDir(), displayId, overrideConfiguration, compatInfo, activityToken); } } mResources = resources; if (container != null) { mBasePackageName = container.mBasePackageName; mOpPackageName = container.mOpPackageName; } else { mBasePackageName = packageInfo.mPackageName; ApplicationInfo ainfo = packageInfo.getApplicationInfo(); Loading @@ -2023,44 +2049,10 @@ class ContextImpl extends Context { mOpPackageName = mBasePackageName; } } mResources = mPackageInfo.getResources(mainThread); mResourcesManager = ResourcesManager.getInstance(); CompatibilityInfo compatInfo = container == null ? null : container.getCompatibilityInfo(); if (mResources != null && ((compatInfo != null && compatInfo.applicationScale != mResources.getCompatibilityInfo().applicationScale) || activityToken != null)) { if (DEBUG) { Log.d(TAG, "loaded context has different scaling. Using container's" + " compatiblity info:" + container.getDisplayMetrics()); } if (compatInfo == null) { compatInfo = packageInfo.getCompatibilityInfo(); } mDisplayAdjustments.setCompatibilityInfo(compatInfo); mDisplayAdjustments.setActivityToken(activityToken); mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY, null, compatInfo, activityToken); } else { mDisplayAdjustments.setCompatibilityInfo(packageInfo.getCompatibilityInfo()); mDisplayAdjustments.setActivityToken(activityToken); } mMainThread = mainThread; mActivityToken = activityToken; mContentResolver = new ApplicationContentResolver(this, mainThread, user); mUser = user; } final void init(Resources resources, ActivityThread mainThread, UserHandle user) { mPackageInfo = null; mBasePackageName = null; mOpPackageName = null; mResources = resources; mMainThread = mainThread; mContentResolver = new ApplicationContentResolver(this, mainThread, user); mUser = user; void installSystemApplicationInfo(ApplicationInfo info) { mPackageInfo.installSystemApplicationInfo(info); } final void scheduleFinalCleanup(String who, String what) { Loading core/java/android/app/LoadedApk.java +21 −30 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public final class LoadedApk { private static final String TAG = "LoadedApk"; private final ActivityThread mActivityThread; private final ApplicationInfo mApplicationInfo; private ApplicationInfo mApplicationInfo; final String mPackageName; private final String mAppDir; private final String mResDir; Loading Loading @@ -110,8 +110,7 @@ public final class LoadedApk { * so MUST NOT call back out to the activity manager. */ public LoadedApk(ActivityThread activityThread, ApplicationInfo aInfo, CompatibilityInfo compatInfo, ActivityThread mainThread, ClassLoader baseLoader, CompatibilityInfo compatInfo, ClassLoader baseLoader, boolean securityViolation, boolean includeCode) { mActivityThread = activityThread; mApplicationInfo = aInfo; Loading @@ -132,31 +131,17 @@ public final class LoadedApk { mSecurityViolation = securityViolation; mIncludeCode = includeCode; mDisplayAdjustments.setCompatibilityInfo(compatInfo); if (mAppDir == null) { if (ActivityThread.mSystemContext == null) { ActivityThread.mSystemContext = ContextImpl.createSystemContext(mainThread); ResourcesManager resourcesManager = ResourcesManager.getInstance(); ActivityThread.mSystemContext.getResources().updateConfiguration( resourcesManager.getConfiguration(), resourcesManager.getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, mDisplayAdjustments), compatInfo); //Slog.i(TAG, "Created system resources " // + mSystemContext.getResources() + ": " // + mSystemContext.getResources().getConfiguration()); } mClassLoader = ActivityThread.mSystemContext.getClassLoader(); mResources = ActivityThread.mSystemContext.getResources(); } } public LoadedApk(ActivityThread activityThread, String name, Context systemContext, ApplicationInfo info, CompatibilityInfo compatInfo) { /** * Create information about the system package. * Must call {@link #installSystemApplicationInfo} later. */ LoadedApk(ActivityThread activityThread) { mActivityThread = activityThread; mApplicationInfo = info != null ? info : new ApplicationInfo(); mApplicationInfo.packageName = name; mPackageName = name; mApplicationInfo = new ApplicationInfo(); mApplicationInfo.packageName = "android"; mPackageName = "android"; mAppDir = null; mResDir = null; mSharedLibraries = null; Loading @@ -166,9 +151,16 @@ public final class LoadedApk { mBaseClassLoader = null; mSecurityViolation = false; mIncludeCode = true; mClassLoader = systemContext.getClassLoader(); mResources = systemContext.getResources(); mDisplayAdjustments.setCompatibilityInfo(compatInfo); mClassLoader = ClassLoader.getSystemClassLoader(); mResources = Resources.getSystem(); } /** * Sets application info about the system package. */ void installSystemApplicationInfo(ApplicationInfo info) { assert info.packageName.equals("android"); mApplicationInfo = info; } public String getPackageName() { Loading Loading @@ -506,8 +498,7 @@ public final class LoadedApk { try { java.lang.ClassLoader cl = getClassLoader(); ContextImpl appContext = new ContextImpl(); appContext.init(this, null, mActivityThread); ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); app = mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext); appContext.setOuterContext(app); Loading Loading
core/java/android/app/ActivityThread.java +13 −29 Original line number Diff line number Diff line Loading @@ -152,7 +152,7 @@ public final class ActivityThread { private static final int LOG_ON_PAUSE_CALLED = 30021; private static final int LOG_ON_RESUME_CALLED = 30022; static ContextImpl mSystemContext = null; private ContextImpl mSystemContext; static IPackageManager sPackageManager; Loading Loading @@ -1645,7 +1645,7 @@ public final class ActivityThread { ? mBoundApplication.processName : null) + ")"); packageInfo = new LoadedApk(this, aInfo, compatInfo, this, baseLoader, new LoadedApk(this, aInfo, compatInfo, baseLoader, securityViolation, includeCode && (aInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0); if (includeCode) { Loading Loading @@ -1698,26 +1698,15 @@ public final class ActivityThread { public ContextImpl getSystemContext() { synchronized (this) { if (mSystemContext == null) { ContextImpl context = ContextImpl.createSystemContext(this); LoadedApk info = new LoadedApk(this, "android", context, null, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO); context.init(info, null, this); context.getResources().updateConfiguration(mResourcesManager.getConfiguration(), mResourcesManager.getDisplayMetricsLocked(Display.DEFAULT_DISPLAY)); mSystemContext = context; //Slog.i(TAG, "Created system resources " + context.getResources() // + ": " + context.getResources().getConfiguration()); } mSystemContext = ContextImpl.createSystemContext(this); } return mSystemContext; } } public void installSystemApplicationInfo(ApplicationInfo info) { synchronized (this) { ContextImpl context = getSystemContext(); context.init(new LoadedApk(this, "android", context, info, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO), null, this); getSystemContext().installSystemApplicationInfo(info); // give ourselves a default profiler mProfiler = new Profiler(); Loading Loading @@ -2203,8 +2192,7 @@ public final class ActivityThread { private Context createBaseContextForActivity(ActivityClientRecord r, final Activity activity) { ContextImpl appContext = new ContextImpl(); appContext.init(r.packageInfo, r.token, this); ContextImpl appContext = ContextImpl.createActivityContext(this, r.packageInfo, r.token); appContext.setOuterContext(activity); // For debugging purposes, if the activity's package name contains the value of Loading Loading @@ -2489,8 +2477,7 @@ public final class ActivityThread { agent = (BackupAgent) cl.loadClass(classname).newInstance(); // set up the agent's context ContextImpl context = new ContextImpl(); context.init(packageInfo, null, this); ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(agent); agent.attach(context); Loading Loading @@ -2562,11 +2549,10 @@ public final class ActivityThread { try { if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name); ContextImpl context = new ContextImpl(); context.init(packageInfo, null, this); ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(service); Application app = packageInfo.makeApplication(false, mInstrumentation); context.setOuterContext(service); service.attach(context, this, data.info.name, data.token, app, ActivityManagerNative.getDefault()); service.onCreate(); Loading Loading @@ -4162,8 +4148,7 @@ public final class ActivityThread { } updateDefaultDensity(); final ContextImpl appContext = new ContextImpl(); appContext.init(data.info, null, this); final ContextImpl appContext = ContextImpl.createAppContext(this, data.info); if (!Process.isIsolated()) { final File cacheDir = appContext.getCacheDir(); Loading Loading @@ -4274,8 +4259,7 @@ public final class ActivityThread { instrApp.nativeLibraryDir = ii.nativeLibraryDir; LoadedApk pi = getPackageInfo(instrApp, data.compatInfo, appContext.getClassLoader(), false, true); ContextImpl instrContext = new ContextImpl(); instrContext.init(pi, null, this); ContextImpl instrContext = ContextImpl.createAppContext(this, pi); try { java.lang.ClassLoader cl = instrContext.getClassLoader(); Loading Loading @@ -4890,8 +4874,8 @@ public final class ActivityThread { UserHandle.myUserId()); try { mInstrumentation = new Instrumentation(); ContextImpl context = new ContextImpl(); context.init(getSystemContext().mPackageInfo, null, this); ContextImpl context = ContextImpl.createAppContext( this, getSystemContext().mPackageInfo); Application app = Instrumentation.newApplication(Application.class, context); mAllApplications.add(app); mInitialApplication = app; Loading
core/java/android/app/ContextImpl.java +95 −103 Original line number Diff line number Diff line Loading @@ -183,22 +183,31 @@ class ContextImpl extends Context { */ private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs; /*package*/ LoadedApk mPackageInfo; private String mBasePackageName; private String mOpPackageName; private Resources mResources; /*package*/ ActivityThread mMainThread; final ActivityThread mMainThread; final LoadedApk mPackageInfo; private final IBinder mActivityToken; private final UserHandle mUser; private final ApplicationContentResolver mContentResolver; private final String mBasePackageName; private final String mOpPackageName; private final ResourcesManager mResourcesManager; private final Resources mResources; private final Display mDisplay; // may be null if default display private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); private final Configuration mOverrideConfiguration; private final boolean mRestricted; private Context mOuterContext; private IBinder mActivityToken = null; private ApplicationContentResolver mContentResolver; private int mThemeResource = 0; private Resources.Theme mTheme = null; private PackageManager mPackageManager; private Display mDisplay; // may be null if default display private Context mReceiverRestrictedContext = null; private boolean mRestricted; private UserHandle mUser; private ResourcesManager mResourcesManager; private final Object mSync = new Object(); Loading @@ -220,8 +229,6 @@ class ContextImpl extends Context { private static final String[] EMPTY_FILE_LIST = {}; final private DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); /** * Override this class when the system service constructor needs a * ContextImpl. Else, use StaticServiceFetcher below. Loading Loading @@ -1879,20 +1886,17 @@ class ContextImpl extends Context { @Override public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) throws NameNotFoundException { final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; if (packageName.equals("system") || packageName.equals("android")) { final ContextImpl context = new ContextImpl(mMainThread.getSystemContext()); context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user); return context; return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, user, restricted, mDisplay, mOverrideConfiguration); } LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags, user.getIdentifier()); LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags, user.getIdentifier()); if (pi != null) { ContextImpl c = new ContextImpl(); c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; c.init(pi, null, mMainThread, mResources, mBasePackageName, user); ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, user, restricted, mDisplay, mOverrideConfiguration); if (c.mResources != null) { return c; } Loading @@ -1909,12 +1913,8 @@ class ContextImpl extends Context { throw new IllegalArgumentException("overrideConfiguration must not be null"); } ContextImpl c = new ContextImpl(); c.init(mPackageInfo, null, mMainThread); c.mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(), getDisplayId(), overrideConfiguration, mResources.getCompatibilityInfo(), mActivityToken); return c; return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, mUser, mRestricted, mDisplay, overrideConfiguration); } @Override Loading @@ -1923,15 +1923,8 @@ class ContextImpl extends Context { throw new IllegalArgumentException("display must not be null"); } int displayId = display.getDisplayId(); ContextImpl context = new ContextImpl(); context.init(mPackageInfo, null, mMainThread); context.mDisplay = display; DisplayAdjustments daj = getDisplayAdjustments(displayId); context.mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(), displayId, null, daj.getCompatibilityInfo(), null); return context; return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, mUser, mRestricted, display, mOverrideConfiguration); } private int getDisplayId() { Loading Loading @@ -1973,43 +1966,76 @@ class ContextImpl extends Context { } static ContextImpl createSystemContext(ActivityThread mainThread) { final ContextImpl context = new ContextImpl(); context.init(Resources.getSystem(), mainThread, Process.myUserHandle()); LoadedApk packageInfo = new LoadedApk(mainThread); ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, false, null, null); context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), context.mResourcesManager.getDisplayMetricsLocked(Display.DEFAULT_DISPLAY)); return context; } ContextImpl() { mOuterContext = this; static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) { if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); return new ContextImpl(null, mainThread, packageInfo, null, null, false, null, null); } /** * Create a new ApplicationContext from an existing one. The new one * works and operates the same as the one it is copying. * * @param context Existing application context. */ public ContextImpl(ContextImpl context) { mPackageInfo = context.mPackageInfo; mBasePackageName = context.mBasePackageName; mOpPackageName = context.mOpPackageName; mResources = context.mResources; mMainThread = context.mMainThread; mContentResolver = context.mContentResolver; mUser = context.mUser; mDisplay = context.mDisplay; mOuterContext = this; mDisplayAdjustments.setCompatibilityInfo(mPackageInfo.getCompatibilityInfo()); static ContextImpl createActivityContext(ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken) { if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); if (activityToken == null) throw new IllegalArgumentException("activityInfo"); return new ContextImpl(null, mainThread, packageInfo, activityToken, null, false, null, null); } final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) { init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle()); private ContextImpl(ContextImpl container, ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted, Display display, Configuration overrideConfiguration) { mOuterContext = this; mMainThread = mainThread; mActivityToken = activityToken; mRestricted = restricted; if (user == null) { user = Process.myUserHandle(); } mUser = user; final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread, Resources container, String basePackageName, UserHandle user) { mPackageInfo = packageInfo; if (basePackageName != null) { mBasePackageName = mOpPackageName = basePackageName; mContentResolver = new ApplicationContentResolver(this, mainThread, user); mResourcesManager = ResourcesManager.getInstance(); mDisplay = display; mOverrideConfiguration = overrideConfiguration; final int displayId = getDisplayId(); CompatibilityInfo compatInfo = null; if (container != null) { compatInfo = container.getDisplayAdjustments(displayId).getCompatibilityInfo(); } if (compatInfo == null && displayId == Display.DEFAULT_DISPLAY) { compatInfo = packageInfo.getCompatibilityInfo(); } mDisplayAdjustments.setCompatibilityInfo(compatInfo); mDisplayAdjustments.setActivityToken(activityToken); Resources resources = packageInfo.getResources(mainThread); if (resources != null) { if (activityToken != null || displayId != Display.DEFAULT_DISPLAY || overrideConfiguration != null || (compatInfo != null && compatInfo.applicationScale != resources.getCompatibilityInfo().applicationScale)) { resources = mResourcesManager.getTopLevelResources( packageInfo.getResDir(), displayId, overrideConfiguration, compatInfo, activityToken); } } mResources = resources; if (container != null) { mBasePackageName = container.mBasePackageName; mOpPackageName = container.mOpPackageName; } else { mBasePackageName = packageInfo.mPackageName; ApplicationInfo ainfo = packageInfo.getApplicationInfo(); Loading @@ -2023,44 +2049,10 @@ class ContextImpl extends Context { mOpPackageName = mBasePackageName; } } mResources = mPackageInfo.getResources(mainThread); mResourcesManager = ResourcesManager.getInstance(); CompatibilityInfo compatInfo = container == null ? null : container.getCompatibilityInfo(); if (mResources != null && ((compatInfo != null && compatInfo.applicationScale != mResources.getCompatibilityInfo().applicationScale) || activityToken != null)) { if (DEBUG) { Log.d(TAG, "loaded context has different scaling. Using container's" + " compatiblity info:" + container.getDisplayMetrics()); } if (compatInfo == null) { compatInfo = packageInfo.getCompatibilityInfo(); } mDisplayAdjustments.setCompatibilityInfo(compatInfo); mDisplayAdjustments.setActivityToken(activityToken); mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY, null, compatInfo, activityToken); } else { mDisplayAdjustments.setCompatibilityInfo(packageInfo.getCompatibilityInfo()); mDisplayAdjustments.setActivityToken(activityToken); } mMainThread = mainThread; mActivityToken = activityToken; mContentResolver = new ApplicationContentResolver(this, mainThread, user); mUser = user; } final void init(Resources resources, ActivityThread mainThread, UserHandle user) { mPackageInfo = null; mBasePackageName = null; mOpPackageName = null; mResources = resources; mMainThread = mainThread; mContentResolver = new ApplicationContentResolver(this, mainThread, user); mUser = user; void installSystemApplicationInfo(ApplicationInfo info) { mPackageInfo.installSystemApplicationInfo(info); } final void scheduleFinalCleanup(String who, String what) { Loading
core/java/android/app/LoadedApk.java +21 −30 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public final class LoadedApk { private static final String TAG = "LoadedApk"; private final ActivityThread mActivityThread; private final ApplicationInfo mApplicationInfo; private ApplicationInfo mApplicationInfo; final String mPackageName; private final String mAppDir; private final String mResDir; Loading Loading @@ -110,8 +110,7 @@ public final class LoadedApk { * so MUST NOT call back out to the activity manager. */ public LoadedApk(ActivityThread activityThread, ApplicationInfo aInfo, CompatibilityInfo compatInfo, ActivityThread mainThread, ClassLoader baseLoader, CompatibilityInfo compatInfo, ClassLoader baseLoader, boolean securityViolation, boolean includeCode) { mActivityThread = activityThread; mApplicationInfo = aInfo; Loading @@ -132,31 +131,17 @@ public final class LoadedApk { mSecurityViolation = securityViolation; mIncludeCode = includeCode; mDisplayAdjustments.setCompatibilityInfo(compatInfo); if (mAppDir == null) { if (ActivityThread.mSystemContext == null) { ActivityThread.mSystemContext = ContextImpl.createSystemContext(mainThread); ResourcesManager resourcesManager = ResourcesManager.getInstance(); ActivityThread.mSystemContext.getResources().updateConfiguration( resourcesManager.getConfiguration(), resourcesManager.getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, mDisplayAdjustments), compatInfo); //Slog.i(TAG, "Created system resources " // + mSystemContext.getResources() + ": " // + mSystemContext.getResources().getConfiguration()); } mClassLoader = ActivityThread.mSystemContext.getClassLoader(); mResources = ActivityThread.mSystemContext.getResources(); } } public LoadedApk(ActivityThread activityThread, String name, Context systemContext, ApplicationInfo info, CompatibilityInfo compatInfo) { /** * Create information about the system package. * Must call {@link #installSystemApplicationInfo} later. */ LoadedApk(ActivityThread activityThread) { mActivityThread = activityThread; mApplicationInfo = info != null ? info : new ApplicationInfo(); mApplicationInfo.packageName = name; mPackageName = name; mApplicationInfo = new ApplicationInfo(); mApplicationInfo.packageName = "android"; mPackageName = "android"; mAppDir = null; mResDir = null; mSharedLibraries = null; Loading @@ -166,9 +151,16 @@ public final class LoadedApk { mBaseClassLoader = null; mSecurityViolation = false; mIncludeCode = true; mClassLoader = systemContext.getClassLoader(); mResources = systemContext.getResources(); mDisplayAdjustments.setCompatibilityInfo(compatInfo); mClassLoader = ClassLoader.getSystemClassLoader(); mResources = Resources.getSystem(); } /** * Sets application info about the system package. */ void installSystemApplicationInfo(ApplicationInfo info) { assert info.packageName.equals("android"); mApplicationInfo = info; } public String getPackageName() { Loading Loading @@ -506,8 +498,7 @@ public final class LoadedApk { try { java.lang.ClassLoader cl = getClassLoader(); ContextImpl appContext = new ContextImpl(); appContext.init(this, null, mActivityThread); ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); app = mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext); appContext.setOuterContext(app); Loading