diff options
| -rw-r--r-- | services/core/java/com/android/server/am/OomAdjuster.java | 2 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java | 44 |
2 files changed, 45 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index ab63e247b556..0e266f5644b6 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1201,6 +1201,7 @@ public class OomAdjuster { >= UNKNOWN_ADJ) { final ProcessServiceRecord psr = app.mServices; switch (state.getCurProcState()) { + case PROCESS_STATE_LAST_ACTIVITY: case PROCESS_STATE_CACHED_ACTIVITY: case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: case ActivityManager.PROCESS_STATE_CACHED_RECENT: @@ -2180,7 +2181,6 @@ public class OomAdjuster { 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); } 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 8656b991b5fc..51aa5284f5f2 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -46,6 +46,7 @@ import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentat import static com.android.server.am.ActivityManagerService.FOLLOW_UP_OOMADJUSTER_UPDATE_MSG; import static com.android.server.am.ProcessList.BACKUP_APP_ADJ; +import static com.android.server.am.ProcessList.CACHED_APP_IMPORTANCE_LEVELS; import static com.android.server.am.ProcessList.CACHED_APP_MAX_ADJ; import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ; import static com.android.server.am.ProcessList.FOREGROUND_APP_ADJ; @@ -844,6 +845,49 @@ public class MockingOomAdjusterTests { @SuppressWarnings("GuardedBy") @Test + public void testUpdateOomAdj_DoAll_PreviousApp() { + final int numberOfApps = 15; + final ProcessRecord[] apps = new ProcessRecord[numberOfApps]; + for (int i = 0; i < numberOfApps; i++) { + apps[i] = spy(makeDefaultProcessRecord(MOCKAPP_PID + i, MOCKAPP_UID + i, + MOCKAPP_PROCESSNAME + i, MOCKAPP_PACKAGENAME + i, true)); + final WindowProcessController wpc = apps[i].getWindowProcessController(); + doReturn(true).when(wpc).isPreviousProcess(); + doReturn(true).when(wpc).hasActivities(); + } + mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE); + setProcessesToLru(apps); + mService.mOomAdjuster.updateOomAdjLocked(OOM_ADJ_REASON_NONE); + + for (int i = 0; i < numberOfApps; i++) { + assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, + SCHED_GROUP_BACKGROUND, "previous"); + } + + if (!Flags.followUpOomadjUpdates()) return; + + for (int i = 0; i < numberOfApps; i++) { + final ArgumentCaptor<Long> followUpTimeCaptor = ArgumentCaptor.forClass(Long.class); + verify(mService.mHandler).sendEmptyMessageAtTime(eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG), + followUpTimeCaptor.capture()); + mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue()); + } + + mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked(); + + for (int i = 0; i < numberOfApps; i++) { + final int mruIndex = numberOfApps - i - 1; + int expectedAdj = CACHED_APP_MIN_ADJ + (mruIndex * 2 * CACHED_APP_IMPORTANCE_LEVELS); + if (expectedAdj > CACHED_APP_MAX_ADJ) { + expectedAdj = CACHED_APP_MAX_ADJ; + } + assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, expectedAdj, + SCHED_GROUP_BACKGROUND, "previous-expired"); + } + } + + @SuppressWarnings("GuardedBy") + @Test public void testUpdateOomAdj_DoOne_Backup() { ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true)); |