diff options
| author | 2024-10-21 17:56:28 -0400 | |
|---|---|---|
| committer | 2024-10-23 11:11:23 -0400 | |
| commit | 2c8511ece10c8441a3ed9b44aa6473cc59fe8255 (patch) | |
| tree | f50274a4362163a1c8e74077274420785c629c4c | |
| parent | 5ade4db7037beef50410da6c06f0b8dacd298e18 (diff) | |
Make tiered cached adj UI tier size configurable
This change makes the UI tier size configurable through overlays. By
default, the UI tier can contain 10 processes.
Test: - atest MockingOomAdjusterTests
- device_config put activity_manager
tiered_cached_adj_ui_tier_size, followed by dumpsys activity
settings to check that the size was updated
- build with a device-specific config to check that the size is
non-default
Bug: 373863708
Bug: 374541382
Flag: com.android.server.am.oomadjuster_cached_app_tiers
Change-Id: Iadca88f79c232a8fb5f6a5a69807a30029bb8a8c
5 files changed, 54 insertions, 22 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 41981715a855..454db21ee3ae 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -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> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b4249557b4c9..e784e7521a9e 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -5498,6 +5498,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 --> diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 65a2c187f1c8..4944cafeb83d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -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); diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 70517145575a..8d16eb5fc95a 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -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)); diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java index 250c2f93e70e..6ab72cd33042 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -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"); |