Loading services/core/java/com/android/server/am/OomAdjuster.java +22 −9 Original line number Diff line number Diff line Loading @@ -78,7 +78,6 @@ import static android.os.Process.THREAD_GROUP_TOP_APP; import static android.os.Process.THREAD_PRIORITY_DISPLAY; import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST; import static android.os.Process.setProcessGroup; import static android.os.Process.setThreadPriority; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP; Loading Loading @@ -447,6 +446,19 @@ public class OomAdjuster { long getElapsedRealtimeMillis() { return SystemClock.elapsedRealtime(); } void batchSetOomAdj(ArrayList<ProcessRecord> procsToOomAdj) { ProcessList.batchSetOomAdj(procsToOomAdj); } void setOomAdj(int pid, int uid, int adj) { ProcessList.setOomAdj(pid, uid, adj); } void setThreadPriority(int tid, int priority) { Process.setThreadPriority(tid, priority); } } boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, Loading Loading @@ -1436,7 +1448,7 @@ public class OomAdjuster { } if (!mProcsToOomAdj.isEmpty()) { ProcessList.batchSetOomAdj(mProcsToOomAdj); mInjector.batchSetOomAdj(mProcsToOomAdj); mProcsToOomAdj.clear(); } Loading Loading @@ -3405,7 +3417,7 @@ public class OomAdjuster { if (isBatchingOomAdj && mConstants.ENABLE_BATCHING_OOM_ADJ) { mProcsToOomAdj.add(app); } else { ProcessList.setOomAdj(app.getPid(), app.uid, state.getCurAdj()); mInjector.setOomAdj(app.getPid(), app.uid, state.getCurAdj()); } if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mService.mCurOomAdjUid == app.info.uid) { Loading Loading @@ -3465,10 +3477,11 @@ public class OomAdjuster { ActivityManagerService.setFifoPriority(app, true /* enable */); } else { // Boost priority for top app UI and render threads setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); mInjector.setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); if (renderThreadTid != 0) { try { setThreadPriority(renderThreadTid, mInjector.setThreadPriority(renderThreadTid, THREAD_PRIORITY_TOP_APP_BOOST); } catch (IllegalArgumentException e) { // thread died, ignore Loading @@ -3482,14 +3495,14 @@ public class OomAdjuster { if (app.useFifoUiScheduling()) { // Reset UI pipeline to SCHED_OTHER ActivityManagerService.setFifoPriority(app, false /* enable */); setThreadPriority(app.getPid(), state.getSavedPriority()); mInjector.setThreadPriority(app.getPid(), state.getSavedPriority()); } else { // Reset priority for top app UI and render threads setThreadPriority(app.getPid(), 0); mInjector.setThreadPriority(app.getPid(), 0); } if (renderThreadTid != 0) { setThreadPriority(renderThreadTid, THREAD_PRIORITY_DISPLAY); mInjector.setThreadPriority(renderThreadTid, THREAD_PRIORITY_DISPLAY); } } } catch (Exception e) { Loading Loading @@ -3679,7 +3692,7 @@ public class OomAdjuster { if (app.useFifoUiScheduling()) { mService.scheduleAsFifoPriority(app.getPid(), true); } else { setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); mInjector.setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); } if (isScreenOnOrAnimatingLocked(state)) { initialSchedGroup = SCHED_GROUP_TOP_APP; Loading services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +59 −45 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ; import static com.android.server.am.ProcessList.FOREGROUND_APP_ADJ; import static com.android.server.am.ProcessList.HEAVY_WEIGHT_APP_ADJ; import static com.android.server.am.ProcessList.HOME_APP_ADJ; import static com.android.server.am.ProcessList.INVALID_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_APP_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_LOW_APP_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ; Loading Loading @@ -106,6 +107,7 @@ import android.platform.test.annotations.Presubmit; import android.platform.test.flag.junit.SetFlagsRule; import android.util.ArrayMap; import android.util.SparseArray; import android.util.SparseIntArray; import com.android.server.LocalServices; import com.android.server.wm.ActivityServiceConnectionsHolder; Loading Loading @@ -244,6 +246,7 @@ public class MockingOomAdjusterTests { mService.mOomAdjuster.resetInternal(); mService.mOomAdjuster.mActiveUids.clear(); LocalServices.removeServiceForTest(PackageManagerInternal.class); mInjector.reset(); } private static <T> void setFieldValue(Class clazz, Object obj, String fieldName, T val) { Loading Loading @@ -2689,12 +2692,12 @@ public class MockingOomAdjusterTests { mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(); assertProcStates(app, true, PROCESS_STATE_SERVICE, assertProcStates(app, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstUiCachedAdj : cachedAdj1, "cch-started-ui-services"); assertProcStates(app2, true, PROCESS_STATE_SERVICE, SCHED_GROUP_BACKGROUND, "cch-started-ui-services", true); assertProcStates(app2, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj2, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); app.mState.setAdjType(null); Loading @@ -2702,7 +2705,8 @@ public class MockingOomAdjusterTests { app.mState.setHasShownUi(false); updateOomAdj(); assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND, "started-services", false); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); app.mState.setAdjType(null); Loading @@ -2710,10 +2714,9 @@ public class MockingOomAdjusterTests { s.lastActivity = now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1; updateOomAdj(); // hasShownUi was set to false for 'app', so 920 is expected for USE_TIERED_CACHED_ADJ. assertProcStates(app, true, PROCESS_STATE_SERVICE, assertProcStates(app, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mServices.stopService(s); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); Loading @@ -2731,10 +2734,11 @@ public class MockingOomAdjusterTests { app.mServices.startService(s); updateOomAdj(); assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); assertProcStates(app2, true, PROCESS_STATE_SERVICE, 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, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); app.mState.setAdjType(null); Loading @@ -2743,19 +2747,21 @@ public class MockingOomAdjusterTests { s.lastActivity = now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1; updateOomAdj(); assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); assertProcStates(app2, true, PROCESS_STATE_SERVICE, 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, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); doReturn(userOther).when(mService.mUserController).getCurrentUserId(); mService.mOomAdjuster.handleUserSwitchedLocked(); updateOomAdj(); assertProcStates(app, true, PROCESS_STATE_SERVICE, assertProcStates(app, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, "cch-started-services"); assertProcStates(app2, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); assertProcStates(app2, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND, "started-services", false); } @SuppressWarnings("GuardedBy") Loading Loading @@ -3158,8 +3164,10 @@ public class MockingOomAdjusterTests { private void assertProcStates(ProcessRecord app, int expectedProcState, int expectedAdj, int expectedSchedGroup) { final ProcessStateRecord state = app.mState; final int pid = app.getPid(); assertEquals(expectedProcState, state.getSetProcState()); assertEquals(expectedAdj, state.getSetAdj()); assertEquals(expectedAdj, mInjector.mLastSetOomAdj.get(pid, INVALID_ADJ)); assertEquals(expectedSchedGroup, state.getSetSchedGroup()); // Below BFGS should never have BFSL. Loading @@ -3173,41 +3181,19 @@ public class MockingOomAdjusterTests { } @SuppressWarnings("GuardedBy") private void assertProcStates(ProcessRecord app, boolean expectedCached, int expectedProcState, int expectedAdj, String expectedAdjType) { private void assertProcStates(ProcessRecord app, int expectedProcState, int expectedAdj, int expectedSchedGroup, String expectedAdjType) { assertProcStates(app, expectedProcState, expectedAdj, expectedSchedGroup); final ProcessStateRecord state = app.mState; assertEquals(expectedCached, state.isCached()); assertEquals(expectedProcState, state.getSetProcState()); assertEquals(expectedAdj, state.getSetAdj()); assertEquals(expectedAdjType, state.getAdjType()); // Below BFGS should never have BFSL. if (expectedProcState > PROCESS_STATE_BOUND_FOREGROUND_SERVICE) { assertNoBfsl(app); } // Above FGS should always have BFSL. if (expectedProcState < PROCESS_STATE_FOREGROUND_SERVICE) { assertBfsl(app); } } @SuppressWarnings("GuardedBy") private void assertProcStates(ProcessRecord app, int expectedProcState, int expectedAdj, int expectedSchedGroup, String expectedAdjType) { int expectedSchedGroup, String expectedAdjType, boolean expectedCached) { assertProcStates(app, expectedProcState, expectedAdj, expectedSchedGroup, expectedAdjType); final ProcessStateRecord state = app.mState; assertEquals(expectedAdjType, state.getAdjType()); assertEquals(expectedProcState, state.getSetProcState()); assertEquals(expectedAdj, state.getSetAdj()); assertEquals(expectedSchedGroup, state.getSetSchedGroup()); // Below BFGS should never have BFSL. if (expectedProcState > PROCESS_STATE_BOUND_FOREGROUND_SERVICE) { assertNoBfsl(app); } // Above FGS should always have BFSL. if (expectedProcState < PROCESS_STATE_FOREGROUND_SERVICE) { assertBfsl(app); } assertEquals(expectedCached, state.isCached()); } private class ProcessRecordBuilder { Loading Loading @@ -3292,6 +3278,7 @@ public class MockingOomAdjusterTests { eq(mSdkSandboxClientAppPackage), anyLong(), anyInt(), anyInt()); ProcessRecord app = new ProcessRecord(mService, ai, mProcessName, mUid, mSdkSandboxClientAppPackage, -1, null); app.setPid(mPid); final ProcessStateRecord state = app.mState; final ProcessServiceRecord services = app.mServices; final ProcessReceiverRecord receivers = app.mReceivers; Loading Loading @@ -3356,6 +3343,13 @@ public class MockingOomAdjusterTests { static class OomAdjusterInjector extends OomAdjuster.Injector { // Jump ahead in time by this offset amount. long mTimeOffsetMillis = 0; private SparseIntArray mLastSetOomAdj = new SparseIntArray(); void reset() { mTimeOffsetMillis = 0; mLastSetOomAdj.clear(); } void jumpUptimeAheadTo(long uptimeMillis) { final long jumpMs = uptimeMillis - getUptimeMillis(); Loading @@ -3372,5 +3366,25 @@ public class MockingOomAdjusterTests { long getElapsedRealtimeMillis() { return SystemClock.elapsedRealtime() + mTimeOffsetMillis; } @Override void batchSetOomAdj(ArrayList<ProcessRecord> procsToOomAdj) { for (ProcessRecord proc : procsToOomAdj) { final int pid = proc.getPid(); if (pid <= 0) continue; mLastSetOomAdj.put(pid, proc.mState.getCurAdj()); } } @Override void setOomAdj(int pid, int uid, int adj) { if (pid <= 0) return; mLastSetOomAdj.put(pid, adj); } @Override void setThreadPriority(int tid, int priority) { // do nothing } } } Loading
services/core/java/com/android/server/am/OomAdjuster.java +22 −9 Original line number Diff line number Diff line Loading @@ -78,7 +78,6 @@ import static android.os.Process.THREAD_GROUP_TOP_APP; import static android.os.Process.THREAD_PRIORITY_DISPLAY; import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST; import static android.os.Process.setProcessGroup; import static android.os.Process.setThreadPriority; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP; Loading Loading @@ -447,6 +446,19 @@ public class OomAdjuster { long getElapsedRealtimeMillis() { return SystemClock.elapsedRealtime(); } void batchSetOomAdj(ArrayList<ProcessRecord> procsToOomAdj) { ProcessList.batchSetOomAdj(procsToOomAdj); } void setOomAdj(int pid, int uid, int adj) { ProcessList.setOomAdj(pid, uid, adj); } void setThreadPriority(int tid, int priority) { Process.setThreadPriority(tid, priority); } } boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, Loading Loading @@ -1436,7 +1448,7 @@ public class OomAdjuster { } if (!mProcsToOomAdj.isEmpty()) { ProcessList.batchSetOomAdj(mProcsToOomAdj); mInjector.batchSetOomAdj(mProcsToOomAdj); mProcsToOomAdj.clear(); } Loading Loading @@ -3405,7 +3417,7 @@ public class OomAdjuster { if (isBatchingOomAdj && mConstants.ENABLE_BATCHING_OOM_ADJ) { mProcsToOomAdj.add(app); } else { ProcessList.setOomAdj(app.getPid(), app.uid, state.getCurAdj()); mInjector.setOomAdj(app.getPid(), app.uid, state.getCurAdj()); } if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mService.mCurOomAdjUid == app.info.uid) { Loading Loading @@ -3465,10 +3477,11 @@ public class OomAdjuster { ActivityManagerService.setFifoPriority(app, true /* enable */); } else { // Boost priority for top app UI and render threads setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); mInjector.setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); if (renderThreadTid != 0) { try { setThreadPriority(renderThreadTid, mInjector.setThreadPriority(renderThreadTid, THREAD_PRIORITY_TOP_APP_BOOST); } catch (IllegalArgumentException e) { // thread died, ignore Loading @@ -3482,14 +3495,14 @@ public class OomAdjuster { if (app.useFifoUiScheduling()) { // Reset UI pipeline to SCHED_OTHER ActivityManagerService.setFifoPriority(app, false /* enable */); setThreadPriority(app.getPid(), state.getSavedPriority()); mInjector.setThreadPriority(app.getPid(), state.getSavedPriority()); } else { // Reset priority for top app UI and render threads setThreadPriority(app.getPid(), 0); mInjector.setThreadPriority(app.getPid(), 0); } if (renderThreadTid != 0) { setThreadPriority(renderThreadTid, THREAD_PRIORITY_DISPLAY); mInjector.setThreadPriority(renderThreadTid, THREAD_PRIORITY_DISPLAY); } } } catch (Exception e) { Loading Loading @@ -3679,7 +3692,7 @@ public class OomAdjuster { if (app.useFifoUiScheduling()) { mService.scheduleAsFifoPriority(app.getPid(), true); } else { setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); mInjector.setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST); } if (isScreenOnOrAnimatingLocked(state)) { initialSchedGroup = SCHED_GROUP_TOP_APP; Loading
services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +59 −45 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ; import static com.android.server.am.ProcessList.FOREGROUND_APP_ADJ; import static com.android.server.am.ProcessList.HEAVY_WEIGHT_APP_ADJ; import static com.android.server.am.ProcessList.HOME_APP_ADJ; import static com.android.server.am.ProcessList.INVALID_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_APP_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_LOW_APP_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ; Loading Loading @@ -106,6 +107,7 @@ import android.platform.test.annotations.Presubmit; import android.platform.test.flag.junit.SetFlagsRule; import android.util.ArrayMap; import android.util.SparseArray; import android.util.SparseIntArray; import com.android.server.LocalServices; import com.android.server.wm.ActivityServiceConnectionsHolder; Loading Loading @@ -244,6 +246,7 @@ public class MockingOomAdjusterTests { mService.mOomAdjuster.resetInternal(); mService.mOomAdjuster.mActiveUids.clear(); LocalServices.removeServiceForTest(PackageManagerInternal.class); mInjector.reset(); } private static <T> void setFieldValue(Class clazz, Object obj, String fieldName, T val) { Loading Loading @@ -2689,12 +2692,12 @@ public class MockingOomAdjusterTests { mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(); assertProcStates(app, true, PROCESS_STATE_SERVICE, assertProcStates(app, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstUiCachedAdj : cachedAdj1, "cch-started-ui-services"); assertProcStates(app2, true, PROCESS_STATE_SERVICE, SCHED_GROUP_BACKGROUND, "cch-started-ui-services", true); assertProcStates(app2, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj2, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); app.mState.setAdjType(null); Loading @@ -2702,7 +2705,8 @@ public class MockingOomAdjusterTests { app.mState.setHasShownUi(false); updateOomAdj(); assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND, "started-services", false); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); app.mState.setAdjType(null); Loading @@ -2710,10 +2714,9 @@ public class MockingOomAdjusterTests { s.lastActivity = now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1; updateOomAdj(); // hasShownUi was set to false for 'app', so 920 is expected for USE_TIERED_CACHED_ADJ. assertProcStates(app, true, PROCESS_STATE_SERVICE, assertProcStates(app, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mServices.stopService(s); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); Loading @@ -2731,10 +2734,11 @@ public class MockingOomAdjusterTests { app.mServices.startService(s); updateOomAdj(); assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); assertProcStates(app2, true, PROCESS_STATE_SERVICE, 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, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); app.mState.setAdjType(null); Loading @@ -2743,19 +2747,21 @@ public class MockingOomAdjusterTests { s.lastActivity = now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1; updateOomAdj(); assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); assertProcStates(app2, true, PROCESS_STATE_SERVICE, 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, "cch-started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); doReturn(userOther).when(mService.mUserController).getCurrentUserId(); mService.mOomAdjuster.handleUserSwitchedLocked(); updateOomAdj(); assertProcStates(app, true, PROCESS_STATE_SERVICE, assertProcStates(app, PROCESS_STATE_SERVICE, mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, "cch-started-services"); assertProcStates(app2, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); SCHED_GROUP_BACKGROUND, "cch-started-services", true); assertProcStates(app2, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND, "started-services", false); } @SuppressWarnings("GuardedBy") Loading Loading @@ -3158,8 +3164,10 @@ public class MockingOomAdjusterTests { private void assertProcStates(ProcessRecord app, int expectedProcState, int expectedAdj, int expectedSchedGroup) { final ProcessStateRecord state = app.mState; final int pid = app.getPid(); assertEquals(expectedProcState, state.getSetProcState()); assertEquals(expectedAdj, state.getSetAdj()); assertEquals(expectedAdj, mInjector.mLastSetOomAdj.get(pid, INVALID_ADJ)); assertEquals(expectedSchedGroup, state.getSetSchedGroup()); // Below BFGS should never have BFSL. Loading @@ -3173,41 +3181,19 @@ public class MockingOomAdjusterTests { } @SuppressWarnings("GuardedBy") private void assertProcStates(ProcessRecord app, boolean expectedCached, int expectedProcState, int expectedAdj, String expectedAdjType) { private void assertProcStates(ProcessRecord app, int expectedProcState, int expectedAdj, int expectedSchedGroup, String expectedAdjType) { assertProcStates(app, expectedProcState, expectedAdj, expectedSchedGroup); final ProcessStateRecord state = app.mState; assertEquals(expectedCached, state.isCached()); assertEquals(expectedProcState, state.getSetProcState()); assertEquals(expectedAdj, state.getSetAdj()); assertEquals(expectedAdjType, state.getAdjType()); // Below BFGS should never have BFSL. if (expectedProcState > PROCESS_STATE_BOUND_FOREGROUND_SERVICE) { assertNoBfsl(app); } // Above FGS should always have BFSL. if (expectedProcState < PROCESS_STATE_FOREGROUND_SERVICE) { assertBfsl(app); } } @SuppressWarnings("GuardedBy") private void assertProcStates(ProcessRecord app, int expectedProcState, int expectedAdj, int expectedSchedGroup, String expectedAdjType) { int expectedSchedGroup, String expectedAdjType, boolean expectedCached) { assertProcStates(app, expectedProcState, expectedAdj, expectedSchedGroup, expectedAdjType); final ProcessStateRecord state = app.mState; assertEquals(expectedAdjType, state.getAdjType()); assertEquals(expectedProcState, state.getSetProcState()); assertEquals(expectedAdj, state.getSetAdj()); assertEquals(expectedSchedGroup, state.getSetSchedGroup()); // Below BFGS should never have BFSL. if (expectedProcState > PROCESS_STATE_BOUND_FOREGROUND_SERVICE) { assertNoBfsl(app); } // Above FGS should always have BFSL. if (expectedProcState < PROCESS_STATE_FOREGROUND_SERVICE) { assertBfsl(app); } assertEquals(expectedCached, state.isCached()); } private class ProcessRecordBuilder { Loading Loading @@ -3292,6 +3278,7 @@ public class MockingOomAdjusterTests { eq(mSdkSandboxClientAppPackage), anyLong(), anyInt(), anyInt()); ProcessRecord app = new ProcessRecord(mService, ai, mProcessName, mUid, mSdkSandboxClientAppPackage, -1, null); app.setPid(mPid); final ProcessStateRecord state = app.mState; final ProcessServiceRecord services = app.mServices; final ProcessReceiverRecord receivers = app.mReceivers; Loading Loading @@ -3356,6 +3343,13 @@ public class MockingOomAdjusterTests { static class OomAdjusterInjector extends OomAdjuster.Injector { // Jump ahead in time by this offset amount. long mTimeOffsetMillis = 0; private SparseIntArray mLastSetOomAdj = new SparseIntArray(); void reset() { mTimeOffsetMillis = 0; mLastSetOomAdj.clear(); } void jumpUptimeAheadTo(long uptimeMillis) { final long jumpMs = uptimeMillis - getUptimeMillis(); Loading @@ -3372,5 +3366,25 @@ public class MockingOomAdjusterTests { long getElapsedRealtimeMillis() { return SystemClock.elapsedRealtime() + mTimeOffsetMillis; } @Override void batchSetOomAdj(ArrayList<ProcessRecord> procsToOomAdj) { for (ProcessRecord proc : procsToOomAdj) { final int pid = proc.getPid(); if (pid <= 0) continue; mLastSetOomAdj.put(pid, proc.mState.getCurAdj()); } } @Override void setOomAdj(int pid, int uid, int adj) { if (pid <= 0) return; mLastSetOomAdj.put(pid, adj); } @Override void setThreadPriority(int tid, int priority) { // do nothing } } }