summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kevin Jeon <kevinjeon@google.com> 2024-10-21 17:56:28 -0400
committer Kevin Jeon <kevinjeon@google.com> 2024-10-23 11:11:23 -0400
commit2c8511ece10c8441a3ed9b44aa6473cc59fe8255 (patch)
treef50274a4362163a1c8e74077274420785c629c4c
parent5ade4db7037beef50410da6c06f0b8dacd298e18 (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
-rw-r--r--core/res/res/values/config.xml3
-rw-r--r--core/res/res/values/symbols.xml3
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerConstants.java20
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java14
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java36
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");