Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56ca7c7c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Never instatiate App class multiple times" into tm-dev am: ff23fb2f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17008117

Change-Id: I3a4b335d37947fa1b6be2efcbb5a9ac0df1658e0
parents 6e7ebee6 ff23fb2f
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -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;
+13 −21
Original line number Diff line number Diff line
@@ -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) {