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

Commit 72aac108 authored by Darryl L Johnson's avatar Darryl L Johnson
Browse files

Add setter for cached state within ProcessRecord.

This will be used to forward cached state changes to
WindowProcessController in order to delay configuration changes
from being sent to processes that are cached.

Test: ActivityTaskManagerServiceTests
Test: OomAdjusterTests
Test: ProcessRecordTests
Test: MockingOomAdjusterTests

Bug: 143432064

Change-Id: I28b0be47f5c9601263c7b1fb337543cf68cc160e
parent 871fe0a9
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -4866,7 +4866,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        updateProcessForegroundLocked(app, false, 0, false);
        app.hasShownUi = false;
        app.setDebugging(false);
        app.cached = false;
        app.setCached(false);
        app.killedByAm = false;
        app.killed = false;
@@ -12154,7 +12154,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                        r.lastSwapPss*1024, new StringBuilder()));
                proto.write(ProcessOomProto.Detail.LAST_CACHED_PSS, DebugUtils.sizeValueToString(
                        r.lastCachedPss*1024, new StringBuilder()));
                proto.write(ProcessOomProto.Detail.CACHED, r.cached);
                proto.write(ProcessOomProto.Detail.CACHED, r.isCached());
                proto.write(ProcessOomProto.Detail.EMPTY, r.empty);
                proto.write(ProcessOomProto.Detail.HAS_ABOVE_CLIENT, r.hasAboveClient);
@@ -12281,7 +12281,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                pw.println();
                pw.print(prefix);
                pw.print("    ");
                pw.print("cached="); pw.print(r.cached);
                pw.print("cached="); pw.print(r.isCached());
                pw.print(" empty="); pw.print(r.empty);
                pw.print(" hasAboveClient="); pw.println(r.hasAboveClient);
+24 −24
Original line number Diff line number Diff line
@@ -248,7 +248,7 @@ public final class OomAdjuster {
            return updateOomAdjLocked(app, oomAdjReason);
        }
        final ProcessRecord TOP_APP = mService.getTopAppLocked();
        final boolean wasCached = app.cached;
        final boolean wasCached = app.isCached();

        mAdjSeq++;

@@ -261,7 +261,7 @@ public final class OomAdjuster {
        boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false,
                SystemClock.uptimeMillis());
        if (oomAdjAll
                && (wasCached != app.cached || app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) {
                && (wasCached != app.isCached() || app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) {
            // Changed to/from cached state, so apps after it in the LRU
            // list may also be changed.
            updateOomAdjLocked(oomAdjReason);
@@ -337,7 +337,7 @@ public final class OomAdjuster {
        mAdjSeq++;

        // Firstly, try to see if the importance of itself gets changed
        final boolean wasCached = app.cached;
        final boolean wasCached = app.isCached();
        final int oldAdj = app.getCurRawAdj();
        final int cachedAdj = oldAdj >= ProcessList.CACHED_APP_MIN_ADJ
                ? oldAdj : ProcessList.UNKNOWN_ADJ;
@@ -347,7 +347,7 @@ public final class OomAdjuster {
        app.resetCachedInfo();
        boolean success = updateOomAdjLocked(app, cachedAdj, topApp, false,
                SystemClock.uptimeMillis());
        if (!success || (wasCached == app.cached && oldAdj != ProcessList.INVALID_ADJ
        if (!success || (wasCached == app.isCached() && oldAdj != ProcessList.INVALID_ADJ
                && wasBackground == ActivityManager.isProcStateBackground(app.setProcState))) {
            // Okay, it's unchanged, it won't impact any service it binds to, we're done here.
            if (DEBUG_OOM_ADJ) {
@@ -965,7 +965,7 @@ public final class OomAdjuster {
            if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
                schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
            }
            app.cached = false;
            app.setCached(false);
            app.empty = false;
            foregroundActivities = true;
        }
@@ -990,7 +990,7 @@ public final class OomAdjuster {
            if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
                schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
            }
            app.cached = false;
            app.setCached(false);
            app.empty = false;
            foregroundActivities = true;
        }
@@ -1022,7 +1022,7 @@ public final class OomAdjuster {
                    }
                }
            }
            app.cached = false;
            app.setCached(false);
            app.empty = false;
            foregroundActivities = true;
        }
@@ -1071,7 +1071,7 @@ public final class OomAdjuster {
        app.adjSource = null;
        app.adjTarget = null;
        app.empty = false;
        app.cached = false;
        app.setCached(false);

        final int appUid = app.info.uid;
        final int logUid = mService.mCurOomAdjUid;
@@ -1207,7 +1207,7 @@ public final class OomAdjuster {
            // value that the caller wants us to.
            adj = cachedAdj;
            procState = PROCESS_STATE_CACHED_EMPTY;
            app.cached = true;
            app.setCached(true);
            app.empty = true;
            app.adjType = "cch-empty";
            if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -1242,7 +1242,7 @@ public final class OomAdjuster {
                adj = ProcessList.PERCEPTIBLE_APP_ADJ;
                procState = PROCESS_STATE_FOREGROUND_SERVICE;
                app.adjType = "fg-service";
                app.cached = false;
                app.setCached(false);
                schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                    reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + app.adjType + ": "
@@ -1252,7 +1252,7 @@ public final class OomAdjuster {
                // The process is display an overlay UI.
                adj = ProcessList.PERCEPTIBLE_APP_ADJ;
                procState = PROCESS_STATE_IMPORTANT_FOREGROUND;
                app.cached = false;
                app.setCached(false);
                app.adjType = "has-overlay-ui";
                schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -1282,7 +1282,7 @@ public final class OomAdjuster {
                // thus out of background check), so we yes the best background level we can.
                adj = ProcessList.PERCEPTIBLE_APP_ADJ;
                procState = PROCESS_STATE_TRANSIENT_BACKGROUND;
                app.cached = false;
                app.setCached(false);
                app.adjType = "force-imp";
                app.adjSource = app.forcingToImportant;
                schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
@@ -1297,7 +1297,7 @@ public final class OomAdjuster {
                // We don't want to kill the current heavy-weight process.
                adj = ProcessList.HEAVY_WEIGHT_APP_ADJ;
                schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
                app.cached = false;
                app.setCached(false);
                app.adjType = "heavy";
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                    reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to heavy: " + app);
@@ -1318,7 +1318,7 @@ public final class OomAdjuster {
                // home app, so we don't want to let it go into the background.
                adj = ProcessList.HOME_APP_ADJ;
                schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
                app.cached = false;
                app.setCached(false);
                app.adjType = "home";
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                    reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to home: " + app);
@@ -1340,7 +1340,7 @@ public final class OomAdjuster {
                // a good experience around switching between two apps.
                adj = ProcessList.PREVIOUS_APP_ADJ;
                schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
                app.cached = false;
                app.setCached(false);
                app.adjType = "previous";
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                    reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to prev: " + app);
@@ -1387,7 +1387,7 @@ public final class OomAdjuster {
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                    reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to backup: " + app);
                }
                app.cached = false;
                app.setCached(false);
            }
            if (procState > ActivityManager.PROCESS_STATE_BACKUP) {
                procState = ActivityManager.PROCESS_STATE_BACKUP;
@@ -1435,7 +1435,7 @@ public final class OomAdjuster {
                                reportOomAdjMessageLocked(TAG_OOM_ADJ,
                                        "Raise adj to started service: " + app);
                            }
                            app.cached = false;
                            app.setCached(false);
                        }
                    }
                    // If we have let the service slide into the background
@@ -1525,7 +1525,7 @@ public final class OomAdjuster {
                                if (adj > clientAdj) {
                                    adjType = "cch-bound-ui-services";
                                }
                                app.cached = false;
                                app.setCached(false);
                                clientAdj = adj;
                                clientProcState = procState;
                            } else {
@@ -1588,8 +1588,8 @@ public final class OomAdjuster {
                                        newAdj = adj;
                                    }
                                }
                                if (!client.cached) {
                                    app.cached = false;
                                if (!client.isCached()) {
                                    app.setCached(false);
                                }
                                if (adj >  newAdj) {
                                    adj = newAdj;
@@ -1713,7 +1713,7 @@ public final class OomAdjuster {
                                    schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
                                }
                            }
                            app.cached = false;
                            app.setCached(false);
                            app.adjType = "service";
                            app.adjTypeCode = ActivityManager.RunningAppProcessInfo
                                    .REASON_SERVICE_IN_USE;
@@ -1778,7 +1778,7 @@ public final class OomAdjuster {
                        app.setCurRawAdj(adj);
                        adjType = "provider";
                    }
                    app.cached &= client.cached;
                    app.setCached(app.isCached() & client.isCached());
                }

                if (clientProcState <= PROCESS_STATE_FOREGROUND_SERVICE) {
@@ -1823,7 +1823,7 @@ public final class OomAdjuster {
                    adj = ProcessList.FOREGROUND_APP_ADJ;
                    app.setCurRawAdj(adj);
                    schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
                    app.cached = false;
                    app.setCached(false);
                    app.adjType = "ext-provider";
                    app.adjTarget = cpr.name;
                    if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -1847,7 +1847,7 @@ public final class OomAdjuster {
            if (adj > ProcessList.PREVIOUS_APP_ADJ) {
                adj = ProcessList.PREVIOUS_APP_ADJ;
                schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
                app.cached = false;
                app.setCached(false);
                app.adjType = "recent-provider";
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                    reportOomAdjMessageLocked(TAG_OOM_ADJ,
+10 −2
Original line number Diff line number Diff line
@@ -237,7 +237,7 @@ class ProcessRecord implements WindowProcessListener {
    long lastTopTime;           // The last time the process was in the TOP state or greater.
    boolean reportLowMemory;    // Set to true when waiting to report low mem
    boolean empty;              // Is this an empty background process?
    boolean cached;             // Is this a cached process?
    private boolean mCached;    // Is this a cached process?
    String adjType;             // Debugging: primary thing impacting oom_adj.
    int adjTypeCode;            // Debugging: adj code to report to app.
    Object adjSource;           // Debugging: option dependent object.
@@ -410,7 +410,7 @@ class ProcessRecord implements WindowProcessListener {
                pw.println();
        pw.print(prefix); pw.print("procStateMemTracker: ");
        procStateMemTracker.dumpLine(pw);
        pw.print(prefix); pw.print("cached="); pw.print(cached);
        pw.print(prefix); pw.print("cached="); pw.print(mCached);
                pw.print(" empty="); pw.println(empty);
        if (serviceb) {
            pw.print(prefix); pw.print("serviceb="); pw.print(serviceb);
@@ -689,6 +689,14 @@ class ProcessRecord implements WindowProcessListener {
        }
    }

    void setCached(boolean cached) {
        mCached = cached;
    }

    boolean isCached() {
        return mCached;
    }

    boolean hasActivities() {
        return mWindowProcessController.hasActivities();
    }
+2 −2
Original line number Diff line number Diff line
@@ -546,7 +546,7 @@ public class MockingOomAdjusterTests {
    public void testUpdateOomAdj_DoOne_NonCachedToCached() {
        ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
                MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
        app.cached = false;
        app.setCached(false);
        app.setCurRawAdj(SERVICE_ADJ);
        doReturn(null).when(sService).getTopAppLocked();
        sService.mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
@@ -1662,7 +1662,7 @@ public class MockingOomAdjusterTests {
        }
        app.lastProviderTime = lastProviderTime;
        app.lastTopTime = lastTopTime;
        app.cached = cached;
        app.setCached(cached);
        for (int i = 0; i < numOfExecutingServices; i++) {
            app.executingServices.add(mock(ServiceRecord.class));
        }