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

Commit b60869b0 authored by Kevin Jeon's avatar Kevin Jeon Committed by Android (Google) Code Review
Browse files

Merge "Make tiered cached adj UI tier size configurable" into main

parents d7ab0ad3 2c8511ec
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -7054,6 +7054,9 @@
         RSS is being collected instead. -->
    <item name="config_am_pssToRssThresholdModifier" format="float" type="dimen">1.5</item>

    <!-- The size of the UI tier if cached app oom_adj_score tiers are enabled. -->
    <integer name="config_am_tieredCachedAdjUiTierSize">10</integer>

    <!-- Whether unlocking and waking a device are sequenced -->
    <bool name="config_orderUnlockAndWake">false</bool>

+3 −0
Original line number Diff line number Diff line
@@ -5499,6 +5499,9 @@
  <java-symbol type="bool" name="config_am_disablePssProfiling" />
  <java-symbol type="dimen" name="config_am_pssToRssThresholdModifier" />

  <!-- For OomAdjuster cached app tiers configurability -->
  <java-symbol type="integer" name="config_am_tieredCachedAdjUiTierSize" />

  <java-symbol type="raw" name="default_ringtone_vibration_effect" />

  <!-- For activity embedding divider -->
+20 −0
Original line number Diff line number Diff line
@@ -163,6 +163,7 @@ final class ActivityManagerConstants extends ContentObserver {

    static final String KEY_USE_TIERED_CACHED_ADJ = "use_tiered_cached_adj";
    static final String KEY_TIERED_CACHED_ADJ_DECAY_TIME = "tiered_cached_adj_decay_time";
    static final String KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE = "tiered_cached_adj_ui_tier_size";

    /**
     * Whether or not to enable the new oom adjuster implementation.
@@ -248,6 +249,8 @@ final class ActivityManagerConstants extends ContentObserver {

    private static final boolean DEFAULT_USE_TIERED_CACHED_ADJ = Flags.oomadjusterCachedAppTiers();
    private static final long DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME = 60 * 1000;
    private static final int TIERED_CACHED_ADJ_MAX_UI_TIER_SIZE = 50;
    private final int mDefaultTieredCachedAdjUiTierSize;

    /**
     * The default value to {@link #KEY_ENABLE_NEW_OOMADJ}.
@@ -1154,6 +1157,9 @@ final class ActivityManagerConstants extends ContentObserver {
    /** @see #KEY_TIERED_CACHED_ADJ_DECAY_TIME */
    public long TIERED_CACHED_ADJ_DECAY_TIME = DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME;

    /** @see #KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE */
    public int TIERED_CACHED_ADJ_UI_TIER_SIZE;

    /** @see #KEY_ENABLE_NEW_OOMADJ */
    public boolean ENABLE_NEW_OOMADJ = DEFAULT_ENABLE_NEW_OOM_ADJ;

@@ -1363,6 +1369,7 @@ final class ActivityManagerConstants extends ContentObserver {
                                break;
                            case KEY_USE_TIERED_CACHED_ADJ:
                            case KEY_TIERED_CACHED_ADJ_DECAY_TIME:
                            case KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE:
                                updateUseTieredCachedAdj();
                                break;
                            case KEY_DISABLE_APP_PROFILER_PSS_PROFILING:
@@ -1466,6 +1473,11 @@ final class ActivityManagerConstants extends ContentObserver {
        mDefaultPssToRssThresholdModifier = context.getResources().getFloat(
                com.android.internal.R.dimen.config_am_pssToRssThresholdModifier);
        PSS_TO_RSS_THRESHOLD_MODIFIER = mDefaultPssToRssThresholdModifier;

        mDefaultTieredCachedAdjUiTierSize = context.getResources().getInteger(
                com.android.internal.R.integer.config_am_tieredCachedAdjUiTierSize);
        TIERED_CACHED_ADJ_UI_TIER_SIZE = Math.min(
                mDefaultTieredCachedAdjUiTierSize, TIERED_CACHED_ADJ_MAX_UI_TIER_SIZE);
    }

    public void start(ContentResolver resolver) {
@@ -2255,6 +2267,12 @@ final class ActivityManagerConstants extends ContentObserver {
            DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
            KEY_TIERED_CACHED_ADJ_DECAY_TIME,
            DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME);
        TIERED_CACHED_ADJ_UI_TIER_SIZE = Math.min(
                DeviceConfig.getInt(
                    DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE,
                    mDefaultTieredCachedAdjUiTierSize),
                TIERED_CACHED_ADJ_MAX_UI_TIER_SIZE);
    }

    private void updateEnableNewOomAdj() {
@@ -2510,6 +2528,8 @@ final class ActivityManagerConstants extends ContentObserver {
        pw.print("="); pw.println(USE_TIERED_CACHED_ADJ);
        pw.print("  "); pw.print(KEY_TIERED_CACHED_ADJ_DECAY_TIME);
        pw.print("="); pw.println(TIERED_CACHED_ADJ_DECAY_TIME);
        pw.print("  "); pw.print(KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE);
        pw.print("="); pw.println(TIERED_CACHED_ADJ_UI_TIER_SIZE);

        pw.print("  "); pw.print(KEY_ENABLE_NEW_OOMADJ);
        pw.print("="); pw.println(ENABLE_NEW_OOMADJ);
+8 −6
Original line number Diff line number Diff line
@@ -1149,6 +1149,8 @@ public class OomAdjuster {
        if (mConstants.USE_TIERED_CACHED_ADJ) {
            final long now = mInjector.getUptimeMillis();
            int uiTargetAdj = 10;
            // mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE is 10 by default, but is configurable.
            final int uiTierMaxAdj = 10 + mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE;
            for (int i = numLru - 1; i >= 0; i--) {
                ProcessRecord app = lruList.get(i);
                final ProcessStateRecord state = app.mState;
@@ -1162,17 +1164,17 @@ public class OomAdjuster {
                    if (opt != null && opt.isFreezeExempt()) {
                        // BIND_WAIVE_PRIORITY and the like get oom_adj 900
                        targetAdj += 0;
                    } else if (state.hasShownUi() && uiTargetAdj < 20) {
                        // The most recent 10 apps that have shown UI get 910-919
                    } else if (state.hasShownUi() && uiTargetAdj < uiTierMaxAdj) {
                        // The most recent UI-showing apps get [910, 910 + ui tier size).
                        targetAdj += uiTargetAdj++;
                    } else if ((state.getSetAdj() >= CACHED_APP_MIN_ADJ)
                            && (state.getLastStateTime()
                                    + mConstants.TIERED_CACHED_ADJ_DECAY_TIME) < now) {
                        // Older cached apps get 950
                        targetAdj += 50;
                        // Older cached apps get 940 + ui tier size (950 by default).
                        targetAdj += 40 + mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE;
                    } else {
                        // Newer cached apps get 920
                        targetAdj += 20;
                        // Newer cached apps get 910 + ui tier size (920 by default).
                        targetAdj += 10 + mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE;
                    }
                    state.setCurRawAdj(targetAdj);
                    state.setCurAdj(psr.modifyRawOomAdj(targetAdj));
+20 −16
Original line number Diff line number Diff line
@@ -167,8 +167,6 @@ public class MockingOomAdjusterTests {
    private static int sFirstCachedAdj = ProcessList.CACHED_APP_MIN_ADJ
            + ProcessList.CACHED_APP_IMPORTANCE_LEVELS;
    private static int sFirstUiCachedAdj = ProcessList.CACHED_APP_MIN_ADJ + 10;
    private static int sFirstNonUiCachedAdj = ProcessList.CACHED_APP_MIN_ADJ + 20;
    private static int sUiTierSize = 10;

    private Context mContext;
    private ProcessStateController mProcessStateController;
@@ -177,6 +175,9 @@ public class MockingOomAdjusterTests {
    private ActivityManagerService mService;
    private OomAdjusterInjector mInjector = new OomAdjusterInjector();

    private int mUiTierSize;
    private int mFirstNonUiCachedAdj;

    @Rule
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

@@ -247,6 +248,9 @@ public class MockingOomAdjusterTests {
        mService.mOomAdjuster.mAdjSeq = 10000;
        mService.mWakefulness = new AtomicInteger(PowerManagerInternal.WAKEFULNESS_AWAKE);
        mSetFlagsRule.enableFlags(Flags.FLAG_NEW_FGS_RESTRICTION_LOGIC);

        mUiTierSize = mService.mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE;
        mFirstNonUiCachedAdj = sFirstUiCachedAdj + mUiTierSize;
    }

    @SuppressWarnings("GuardedBy")
@@ -927,8 +931,8 @@ public class MockingOomAdjusterTests {
            final int mruIndex = numberOfApps - i - 1;
            int expectedAdj;
            if (mService.mConstants.USE_TIERED_CACHED_ADJ) {
                expectedAdj = (i < numberOfApps - sUiTierSize)
                        ? sFirstNonUiCachedAdj : sFirstUiCachedAdj + mruIndex;
                expectedAdj = (i < numberOfApps - mUiTierSize)
                        ? mFirstNonUiCachedAdj : sFirstUiCachedAdj + mruIndex;
            } else {
                expectedAdj = CACHED_APP_MIN_ADJ + (mruIndex * 2 * CACHED_APP_IMPORTANCE_LEVELS);
                if (expectedAdj > CACHED_APP_MAX_ADJ) {
@@ -1108,7 +1112,7 @@ public class MockingOomAdjusterTests {
        updateOomAdj(app);

        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstNonUiCachedAdj : sFirstCachedAdj;
                ? mFirstNonUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND);
    }

@@ -1545,7 +1549,7 @@ public class MockingOomAdjusterTests {
        updateOomAdj(app);

        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstNonUiCachedAdj : sFirstCachedAdj;
                ? mFirstNonUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND);
    }

@@ -1563,7 +1567,7 @@ public class MockingOomAdjusterTests {
        updateOomAdj(app, client);

        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstNonUiCachedAdj : sFirstCachedAdj;
                ? mFirstNonUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND);
    }

@@ -1694,7 +1698,7 @@ public class MockingOomAdjusterTests {
        mProcessStateController.runFollowUpUpdate();

        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstNonUiCachedAdj : sFirstCachedAdj;
                ? mFirstNonUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND,
                "cch-empty");
        // Follow up should not have been called again.
@@ -2741,7 +2745,7 @@ public class MockingOomAdjusterTests {
        final int userOther = 1;

        // cachedAdj1 and cachedAdj2 will be read if USE_TIERED_CACHED_ADJ is disabled. Otherwise,
        // sFirstUiCachedAdj and sFirstNonUiCachedAdj are used instead.
        // sFirstUiCachedAdj and mFirstNonUiCachedAdj are used instead.
        final int cachedAdj1 = CACHED_APP_MIN_ADJ + CACHED_APP_IMPORTANCE_LEVELS;
        final int cachedAdj2 = cachedAdj1 + CACHED_APP_IMPORTANCE_LEVELS * 2;
        doReturn(userOwner).when(mService.mUserController).getCurrentUserId();
@@ -2789,7 +2793,7 @@ public class MockingOomAdjusterTests {
                mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstUiCachedAdj : cachedAdj1,
                SCHED_GROUP_BACKGROUND, "cch-started-ui-services", true);
        assertProcStates(app2, PROCESS_STATE_SERVICE,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj2,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj2,
                SCHED_GROUP_BACKGROUND, "cch-started-services", true);

        app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
@@ -2809,7 +2813,7 @@ public class MockingOomAdjusterTests {
        updateOomAdj();

        assertProcStates(app, PROCESS_STATE_SERVICE,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1,
                SCHED_GROUP_BACKGROUND, "cch-started-services", true);

        mProcessStateController.stopService(app.mServices, s);
@@ -2831,7 +2835,7 @@ public class MockingOomAdjusterTests {
        assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND,
                "started-services", false);
        assertProcStates(app2, PROCESS_STATE_SERVICE,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1,
                SCHED_GROUP_BACKGROUND, "cch-started-services", true);

        app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
@@ -2845,7 +2849,7 @@ public class MockingOomAdjusterTests {
        assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND,
                "started-services", false);
        assertProcStates(app2, PROCESS_STATE_SERVICE,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1,
                SCHED_GROUP_BACKGROUND, "cch-started-services", true);

        doReturn(userOther).when(mService.mUserController).getCurrentUserId();
@@ -2853,7 +2857,7 @@ public class MockingOomAdjusterTests {

        updateOomAdj();
        assertProcStates(app, PROCESS_STATE_SERVICE,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1,
                mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1,
                SCHED_GROUP_BACKGROUND, "cch-started-services", true);
        assertProcStates(app2, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND,
                "started-services", false);
@@ -3157,7 +3161,7 @@ public class MockingOomAdjusterTests {
        mProcessStateController.runFollowUpUpdate();

        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstNonUiCachedAdj : sFirstCachedAdj;
                ? mFirstNonUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app, PROCESS_STATE_SERVICE, expectedAdj, SCHED_GROUP_BACKGROUND,
                "cch-started-services");
        // Follow up should not have been called again.
@@ -3192,7 +3196,7 @@ public class MockingOomAdjusterTests {
        mProcessStateController.runFollowUpUpdate();

        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstNonUiCachedAdj : sFirstCachedAdj;
                ? mFirstNonUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app1, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND,
                "cch-empty");