Merge "Fix compat issue with apps directly calling LoadedApk.makeApplication()." into tm-dev

This commit is contained in:
TreeHugger Robot
2022-03-10 02:35:16 +00:00
committed by Android (Google) Code Review
2 changed files with 35 additions and 10 deletions

View File

@@ -3587,7 +3587,7 @@ public final class ActivityThread extends ClientTransactionHandler
} }
try { try {
Application app = r.packageInfo.makeApplication(false, mInstrumentation); Application app = r.packageInfo.makeApplicationInner(false, mInstrumentation);
if (localLOGV) Slog.v(TAG, "Performing launch of " + r); if (localLOGV) Slog.v(TAG, "Performing launch of " + r);
if (localLOGV) Slog.v( if (localLOGV) Slog.v(
@@ -4286,7 +4286,7 @@ public final class ActivityThread extends ClientTransactionHandler
BroadcastReceiver receiver; BroadcastReceiver receiver;
ContextImpl context; ContextImpl context;
try { try {
app = packageInfo.makeApplication(false, mInstrumentation); app = packageInfo.makeApplicationInner(false, mInstrumentation);
context = (ContextImpl) app.getBaseContext(); context = (ContextImpl) app.getBaseContext();
if (data.info.splitName != null) { if (data.info.splitName != null) {
context = (ContextImpl) context.createContextForSplit(data.info.splitName); context = (ContextImpl) context.createContextForSplit(data.info.splitName);
@@ -4475,7 +4475,7 @@ public final class ActivityThread extends ClientTransactionHandler
try { try {
if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name); if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name);
Application app = packageInfo.makeApplication(false, mInstrumentation); Application app = packageInfo.makeApplicationInner(false, mInstrumentation);
final java.lang.ClassLoader cl; final java.lang.ClassLoader cl;
if (data.info.splitName != null) { if (data.info.splitName != null) {
@@ -6695,7 +6695,7 @@ public final class ActivityThread extends ClientTransactionHandler
try { try {
// If the app is being launched for full backup or restore, bring it up in // If the app is being launched for full backup or restore, bring it up in
// a restricted environment with the base application class. // a restricted environment with the base application class.
app = data.info.makeApplication(data.restrictedBackupMode, null); app = data.info.makeApplicationInner(data.restrictedBackupMode, null);
// Propagate autofill compat state // Propagate autofill compat state
app.setAutofillOptions(data.autofillOptions); app.setAutofillOptions(data.autofillOptions);
@@ -7565,7 +7565,7 @@ public final class ActivityThread extends ClientTransactionHandler
mInstrumentation.basicInit(this); mInstrumentation.basicInit(this);
ContextImpl context = ContextImpl.createAppContext( ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo); this, getSystemContext().mPackageInfo);
mInitialApplication = context.mPackageInfo.makeApplication(true, null); mInitialApplication = context.mPackageInfo.makeApplicationInner(true, null);
mInitialApplication.onCreate(); mInitialApplication.onCreate();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException( throw new RuntimeException(

View File

@@ -1352,9 +1352,28 @@ public final class LoadedApk {
return mResources; return mResources;
} }
/**
* This is for 3p apps accessing this hidden API directly... in which case, we don't return
* the cached Application instance.
*/
@UnsupportedAppUsage @UnsupportedAppUsage
public Application makeApplication(boolean forceDefaultAppClass, public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) { Instrumentation instrumentation) {
return makeApplicationInner(forceDefaultAppClass, instrumentation,
/* allowDuplicateInstances= */ true);
}
/**
* This is for all the (internal) callers, for which we do return the cached instance.
*/
public Application makeApplicationInner(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
return makeApplicationInner(forceDefaultAppClass, instrumentation,
/* allowDuplicateInstances= */ false);
}
private Application makeApplicationInner(boolean forceDefaultAppClass,
Instrumentation instrumentation, boolean allowDuplicateInstances) {
if (mApplication != null) { if (mApplication != null) {
return mApplication; return mApplication;
} }
@@ -1366,11 +1385,15 @@ public final class LoadedApk {
// Looks like this is always happening for the system server, because // Looks like this is always happening for the system server, because
// the LoadedApk created in systemMain() -> attach() isn't cached properly? // the LoadedApk created in systemMain() -> attach() isn't cached properly?
if (!"android".equals(mPackageName)) { if (!"android".equals(mPackageName)) {
Slog.wtf(TAG, "App instance already created for package=" + mPackageName Slog.wtfStack(TAG, "App instance already created for package=" + mPackageName
+ " instance=" + cached); + " instance=" + cached);
} }
mApplication = cached; if (!allowDuplicateInstances) {
return cached; mApplication = cached;
return cached;
}
// Some apps intentionally call makeApplication() to create a new Application
// instance... Sigh...
} }
} }
@@ -1421,8 +1444,10 @@ public final class LoadedApk {
} }
mActivityThread.mAllApplications.add(app); mActivityThread.mAllApplications.add(app);
mApplication = app; mApplication = app;
synchronized (sApplications) { if (!allowDuplicateInstances) {
sApplications.put(mPackageName, app); synchronized (sApplications) {
sApplications.put(mPackageName, app);
}
} }
if (instrumentation != null) { if (instrumentation != null) {