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 {
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(
@@ -4286,7 +4286,7 @@ public final class ActivityThread extends ClientTransactionHandler
BroadcastReceiver receiver;
ContextImpl context;
try {
app = packageInfo.makeApplication(false, mInstrumentation);
app = packageInfo.makeApplicationInner(false, mInstrumentation);
context = (ContextImpl) app.getBaseContext();
if (data.info.splitName != null) {
context = (ContextImpl) context.createContextForSplit(data.info.splitName);
@@ -4475,7 +4475,7 @@ public final class ActivityThread extends ClientTransactionHandler
try {
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;
if (data.info.splitName != null) {
@@ -6695,7 +6695,7 @@ public final class ActivityThread extends ClientTransactionHandler
try {
// If the app is being launched for full backup or restore, bring it up in
// 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
app.setAutofillOptions(data.autofillOptions);
@@ -7565,7 +7565,7 @@ public final class ActivityThread extends ClientTransactionHandler
mInstrumentation.basicInit(this);
ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo);
mInitialApplication = context.mPackageInfo.makeApplication(true, null);
mInitialApplication = context.mPackageInfo.makeApplicationInner(true, null);
mInitialApplication.onCreate();
} catch (Exception e) {
throw new RuntimeException(

View File

@@ -1352,9 +1352,28 @@ public final class LoadedApk {
return mResources;
}
/**
* This is for 3p apps accessing this hidden API directly... in which case, we don't return
* the cached Application instance.
*/
@UnsupportedAppUsage
public Application makeApplication(boolean forceDefaultAppClass,
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) {
return mApplication;
}
@@ -1366,11 +1385,15 @@ public final class LoadedApk {
// Looks like this is always happening for the system server, because
// the LoadedApk created in systemMain() -> attach() isn't cached properly?
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);
}
mApplication = cached;
return cached;
if (!allowDuplicateInstances) {
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);
mApplication = app;
synchronized (sApplications) {
sApplications.put(mPackageName, app);
if (!allowDuplicateInstances) {
synchronized (sApplications) {
sApplications.put(mPackageName, app);
}
}
if (instrumentation != null) {