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

Commit 2cdd45e2 authored by Tim Murray's avatar Tim Murray
Browse files

Reland OomAdjuster: demote previous process to cached after configurable timeout

Previous processes shouldn't stay out of cached indefinitely; they
should be eventually moved to cached and allowed to be restricted and
frozen. Add a configurable timeout to decide when the previous app
should move to cached.

The default timeout is 60s.

Reverts change bb195e7a.

Bug: 261065790
Test: atest MockingOomAdjusterTests

Change-Id: I0494059976275cab309a5353bfef608da796bd2f
parent 0baf15dc
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ final class ActivityManagerConstants extends ContentObserver {
    static final String KEY_KILL_BG_RESTRICTED_CACHED_IDLE = "kill_bg_restricted_cached_idle";
    static final String KEY_KILL_BG_RESTRICTED_CACHED_IDLE_SETTLE_TIME =
            "kill_bg_restricted_cached_idle_settle_time";
    static final String KEY_MAX_PREVIOUS_TIME = "max_previous_time";
    /**
     * Note this key is on {@link DeviceConfig#NAMESPACE_ACTIVITY_MANAGER_COMPONENT_ALIAS}.
     * @see #mEnableComponentAlias
@@ -192,6 +193,7 @@ final class ActivityManagerConstants extends ContentObserver {
    private static final float DEFAULT_FGS_START_DENIED_LOG_SAMPLE_RATE = 1; // 100%
    private static final long DEFAULT_PROCESS_KILL_TIMEOUT_MS = 10 * 1000;
    private static final long DEFAULT_NETWORK_ACCESS_TIMEOUT_MS = 200; // 0.2 sec
    private static final long DEFAULT_MAX_PREVIOUS_TIME = 60 * 1000; // 60s

    static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60 * 1000;
    static final long DEFAULT_KILL_BG_RESTRICTED_CACHED_IDLE_SETTLE_TIME_MS = 60 * 1000;
@@ -522,6 +524,9 @@ final class ActivityManagerConstants extends ContentObserver {
    public long TOP_TO_ALMOST_PERCEPTIBLE_GRACE_DURATION =
            DEFAULT_TOP_TO_ALMOST_PERCEPTIBLE_GRACE_DURATION;

    // How long a process can remain at previous oom_adj before dropping to cached
    public static long MAX_PREVIOUS_TIME = DEFAULT_MAX_PREVIOUS_TIME;

    /**
     * The minimum time we allow between crashes, for us to consider this
     * application to be bad and stop its services and reject broadcasts.
@@ -1143,6 +1148,9 @@ final class ActivityManagerConstants extends ContentObserver {
                            case KEY_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION:
                                updateEnableWaitForFinishAttachApplication();
                                break;
                            case KEY_MAX_PREVIOUS_TIME:
                                updateMaxPreviousTime();
                                break;
                            default:
                                break;
                        }
@@ -1782,6 +1790,7 @@ final class ActivityManagerConstants extends ContentObserver {
                DEFAULT_LOW_SWAP_THRESHOLD_PERCENT);
    }


    private void updateTopToFgsGraceDuration() {
        TOP_TO_FGS_GRACE_DURATION = DeviceConfig.getLong(
                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -1789,6 +1798,13 @@ final class ActivityManagerConstants extends ContentObserver {
                DEFAULT_TOP_TO_FGS_GRACE_DURATION);
    }

    private void updateMaxPreviousTime() {
        MAX_PREVIOUS_TIME = DeviceConfig.getLong(
                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_MAX_PREVIOUS_TIME,
                DEFAULT_MAX_PREVIOUS_TIME);
    }

    private void updateMinAssocLogDuration() {
        MIN_ASSOC_LOG_DURATION = DeviceConfig.getLong(
                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MIN_ASSOC_LOG_DURATION,
+27 −15
Original line number Diff line number Diff line
@@ -2019,12 +2019,23 @@ public class OomAdjuster {
                }
            }
        }

        if (state.getCachedIsPreviousProcess() && state.getCachedHasActivities()) {
            // This was the previous process that showed UI to the user.  We want to
            // try to keep it around more aggressively, to give a good experience
            // around switching between two apps. However, we don't want to keep the
            // process in this privileged state indefinitely. Eventually, allow the
            // app to be demoted to cached.
            if ((state.getSetProcState() == PROCESS_STATE_LAST_ACTIVITY
                    && (state.getLastStateTime() + mConstants.MAX_PREVIOUS_TIME) < now)) {
                procState = PROCESS_STATE_LAST_ACTIVITY;
                schedGroup = SCHED_GROUP_BACKGROUND;
                state.setAdjType("previous-expired");
                adj = CACHED_APP_MIN_ADJ;
                if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                    reportOomAdjMessageLocked(TAG_OOM_ADJ, "Expire prev adj: " + app);
                }
            } else {
                if (adj > PREVIOUS_APP_ADJ) {
                // This was the previous process that showed UI to the user.
                // We want to try to keep it around more aggressively, to give
                // a good experience around switching between two apps.
                    adj = PREVIOUS_APP_ADJ;
                    schedGroup = SCHED_GROUP_BACKGROUND;
                    state.setCached(false);
@@ -2041,6 +2052,7 @@ public class OomAdjuster {
                    }
                }
            }
        }

        if (false) Slog.i(TAG, "OOM " + app + ": initial adj=" + adj
                + " reason=" + state.getAdjType());