diff options
| author | 2022-02-24 15:19:42 -0800 | |
|---|---|---|
| committer | 2022-02-24 15:39:22 -0800 | |
| commit | c3565962b31eb58375181cc3ae2a12ad89917c6e (patch) | |
| tree | 5adacde209dd0a5af2ae625cdb66e6607ed8abe6 | |
| parent | eebb589d99f49cca95da1bbfa93d2eddfddafb24 (diff) | |
Never instatiate App class multiple times
- GMS-core is still sometimes seeing the app class being
instatiated multiple times.
Let's just cache the app instance to avoid such situations.
- Also removed some tentative WTFs, which have never been triggered.
(so they should be unrelated to the dup-app bug)
Bug: 185177290
Test: Boot / treehugger
Change-Id: I4c74a5798264472d1bfbf5604f399a49e5946c64
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 6 | ||||
| -rw-r--r-- | core/java/android/app/LoadedApk.java | 34 |
2 files changed, 13 insertions, 27 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 61d186579f1b..64f0301fab22 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4469,12 +4469,6 @@ public final class ActivityThread extends ClientTransactionHandler // we are back active so skip it. unscheduleGcIdler(); - // To investigate "duplciate Application objects" bug (b/185177290) - if (UserHandle.myUserId() != UserHandle.getUserId(data.info.applicationInfo.uid)) { - Slog.wtf(TAG, "handleCreateService called with wrong appinfo UID: myUserId=" - + UserHandle.myUserId() + " appinfo.uid=" + data.info.applicationInfo.uid); - } - LoadedApk packageInfo = getPackageInfoNoCheck( data.info.applicationInfo, data.compatInfo); Service service = null; diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 99a523a0e18a..cf259e577a5a 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -160,6 +160,13 @@ public final class LoadedApk { private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mUnboundServices = new ArrayMap<>(); private AppComponentFactory mAppComponentFactory; + + /** + * We cache the instantiated application object for each package on this process here. + */ + @GuardedBy("sApplications") + private static final ArrayMap<String, Application> sApplications = new ArrayMap<>(4); + private final Object mLock = new Object(); Application getApplication() { @@ -1345,14 +1352,6 @@ public final class LoadedApk { return mResources; } - /** - * Used to investigate "duplicate app objects" bug (b/185177290). - * makeApplication() should only be called on the main thread, so no synchronization should - * be needed, but syncing anyway just in case. - */ - @GuardedBy("sApplicationCache") - private static final ArrayMap<String, Application> sApplicationCache = new ArrayMap<>(4); - @UnsupportedAppUsage public Application makeApplication(boolean forceDefaultAppClass, Instrumentation instrumentation) { @@ -1361,15 +1360,8 @@ public final class LoadedApk { } Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication"); - // For b/185177290. - final boolean wrongUser = - UserHandle.myUserId() != UserHandle.getUserId(mApplicationInfo.uid); - if (wrongUser) { - Slog.wtf(TAG, "makeApplication called with wrong appinfo UID: myUserId=" - + UserHandle.myUserId() + " appinfo.uid=" + mApplicationInfo.uid); - } - synchronized (sApplicationCache) { - final Application cached = sApplicationCache.get(mPackageName); + synchronized (sApplications) { + final Application cached = sApplications.get(mPackageName); if (cached != null) { // Looks like this is always happening for the system server, because // the LoadedApk created in systemMain() -> attach() isn't cached properly? @@ -1377,8 +1369,8 @@ public final class LoadedApk { Slog.wtf(TAG, "App instance already created for package=" + mPackageName + " instance=" + cached); } - // TODO Return the cached one, unles it's for the wrong user? - // For now, we just add WTF checks. + mApplication = cached; + return cached; } } @@ -1429,8 +1421,8 @@ public final class LoadedApk { } mActivityThread.mAllApplications.add(app); mApplication = app; - synchronized (sApplicationCache) { - sApplicationCache.put(mPackageName, app); + synchronized (sApplications) { + sApplications.put(mPackageName, app); } if (instrumentation != null) { |