diff options
| -rw-r--r-- | services/core/java/com/android/server/am/OomAdjuster.java | 12 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java | 16 |
2 files changed, 25 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index f610d7d63b6c..30674db484d5 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -410,6 +410,13 @@ public final class OomAdjuster { mAdjSeq--; // Update these reachable processes updateOomAdjLockedInner(oomAdjReason, topApp, processes, uids, false); + } else if (app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ) { + // In case the app goes from non-cached to cached but it doesn't have other reachable + // processes, its adj could be still unknown as of now, assign one. + processes.add(app); + assignCachedAdjIfNecessary(processes); + applyOomAdjLocked(app, false, SystemClock.uptimeMillis(), + SystemClock.elapsedRealtime()); } mService.mOomAdjProfiler.oomAdjEnded(); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); @@ -490,7 +497,7 @@ public final class OomAdjuster { } } - assignCachedAdjIfNecessary(); + assignCachedAdjIfNecessary(mProcessList.mLruProcesses); if (fullUpdate) { // There won't be cycles if we didn't compute clients above. // Cycle strategy: @@ -564,8 +571,7 @@ public final class OomAdjuster { } } - private void assignCachedAdjIfNecessary() { - ArrayList<ProcessRecord> lruList = mProcessList.mLruProcesses; + private void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { final int numLru = lruList.size(); // First update the OOM adjustment for each of the 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 57f55e32a381..e7f6a7484881 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -61,6 +61,7 @@ import static com.android.server.am.ProcessList.UNKNOWN_ADJ; import static com.android.server.am.ProcessList.VISIBLE_APP_ADJ; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.AdditionalAnswers.answer; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; @@ -542,6 +543,21 @@ public class MockingOomAdjusterTests { @SuppressWarnings("GuardedBy") @Test + public void testUpdateOomAdj_DoOne_NonCachedToCached() { + ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, + MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); + app.cached = false; + app.setCurRawAdj(SERVICE_ADJ); + doReturn(null).when(sService).getTopAppLocked(); + sService.mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE; + sService.mOomAdjuster.updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_NONE); + + assertTrue(ProcessList.CACHED_APP_MIN_ADJ <= app.setAdj); + assertTrue(ProcessList.CACHED_APP_MAX_ADJ >= app.setAdj); + } + + @SuppressWarnings("GuardedBy") + @Test public void testUpdateOomAdj_DoOne_Service_Started() { ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); |