Loading services/core/java/com/android/server/am/OomAdjuster.java +9 −3 Original line number Original line Diff line number Diff line Loading @@ -410,6 +410,13 @@ public final class OomAdjuster { mAdjSeq--; mAdjSeq--; // Update these reachable processes // Update these reachable processes updateOomAdjLockedInner(oomAdjReason, topApp, processes, uids, false); 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(); mService.mOomAdjProfiler.oomAdjEnded(); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Loading Loading @@ -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. if (fullUpdate) { // There won't be cycles if we didn't compute clients above. // Cycle strategy: // Cycle strategy: Loading Loading @@ -564,8 +571,7 @@ public final class OomAdjuster { } } } } private void assignCachedAdjIfNecessary() { private void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { ArrayList<ProcessRecord> lruList = mProcessList.mLruProcesses; final int numLru = lruList.size(); final int numLru = lruList.size(); // First update the OOM adjustment for each of the // First update the OOM adjustment for each of the Loading services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -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 com.android.server.am.ProcessList.VISIBLE_APP_ADJ; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.AdditionalAnswers.answer; import static org.mockito.AdditionalAnswers.answer; import static org.mockito.Mockito.any; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyInt; Loading Loading @@ -540,6 +541,21 @@ public class MockingOomAdjusterTests { SCHED_GROUP_DEFAULT); SCHED_GROUP_DEFAULT); } } @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") @SuppressWarnings("GuardedBy") @Test @Test public void testUpdateOomAdj_DoOne_Service_Started() { public void testUpdateOomAdj_DoOne_Service_Started() { Loading Loading
services/core/java/com/android/server/am/OomAdjuster.java +9 −3 Original line number Original line Diff line number Diff line Loading @@ -410,6 +410,13 @@ public final class OomAdjuster { mAdjSeq--; mAdjSeq--; // Update these reachable processes // Update these reachable processes updateOomAdjLockedInner(oomAdjReason, topApp, processes, uids, false); 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(); mService.mOomAdjProfiler.oomAdjEnded(); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Loading Loading @@ -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. if (fullUpdate) { // There won't be cycles if we didn't compute clients above. // Cycle strategy: // Cycle strategy: Loading Loading @@ -564,8 +571,7 @@ public final class OomAdjuster { } } } } private void assignCachedAdjIfNecessary() { private void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { ArrayList<ProcessRecord> lruList = mProcessList.mLruProcesses; final int numLru = lruList.size(); final int numLru = lruList.size(); // First update the OOM adjustment for each of the // First update the OOM adjustment for each of the Loading
services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -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 com.android.server.am.ProcessList.VISIBLE_APP_ADJ; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.AdditionalAnswers.answer; import static org.mockito.AdditionalAnswers.answer; import static org.mockito.Mockito.any; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyInt; Loading Loading @@ -540,6 +541,21 @@ public class MockingOomAdjusterTests { SCHED_GROUP_DEFAULT); SCHED_GROUP_DEFAULT); } } @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") @SuppressWarnings("GuardedBy") @Test @Test public void testUpdateOomAdj_DoOne_Service_Started() { public void testUpdateOomAdj_DoOne_Service_Started() { Loading