Loading services/core/java/com/android/server/am/ActiveServices.java +3 −1 Original line number Diff line number Diff line Loading @@ -2928,7 +2928,9 @@ public final class ActiveServices { final ProcessServiceRecord clientPsr = b.client.mServices; clientPsr.addConnection(c); c.startAssociationIfNeeded(); if ((c.flags&Context.BIND_ABOVE_CLIENT) != 0) { // Don't set hasAboveClient if binding to self to prevent modifyRawOomAdj() from // dropping the process' adjustment level. if (b.client != s.app && (c.flags & Context.BIND_ABOVE_CLIENT) != 0) { clientPsr.setHasAboveClient(true); } if ((c.flags&Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0) { Loading services/core/java/com/android/server/am/ProcessServiceRecord.java +2 −1 Original line number Diff line number Diff line Loading @@ -258,7 +258,8 @@ final class ProcessServiceRecord { mHasAboveClient = false; for (int i = mConnections.size() - 1; i >= 0; i--) { ConnectionRecord cr = mConnections.valueAt(i); if ((cr.flags & Context.BIND_ABOVE_CLIENT) != 0) { if (cr.binding.service.app.mServices != this && (cr.flags & Context.BIND_ABOVE_CLIENT) != 0) { mHasAboveClient = true; break; } Loading services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +23 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,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.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.mockito.AdditionalAnswers.answer; Loading Loading @@ -2208,6 +2209,28 @@ public class MockingOomAdjusterTests { assertProcStates(app2, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); } @SuppressWarnings("GuardedBy") @Test public void testUpdateOomAdj_DoOne_AboveClient_SameProcess() { ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true)); doReturn(PROCESS_STATE_TOP).when(sService.mAtmInternal).getTopProcessState(); doReturn(app).when(sService).getTopApp(); sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE); sService.mOomAdjuster.updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_NONE); assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj()); // Simulate binding to a service in the same process using BIND_ABOVE_CLIENT and // verify that its OOM adjustment level is unaffected. bindService(app, app, null, Context.BIND_ABOVE_CLIENT, mock(IBinder.class)); app.mServices.updateHasAboveClientLocked(); assertFalse(app.mServices.hasAboveClient()); sService.mOomAdjuster.updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_NONE); assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj()); } private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName, String packageName, boolean hasShownUi) { long now = SystemClock.uptimeMillis(); Loading Loading
services/core/java/com/android/server/am/ActiveServices.java +3 −1 Original line number Diff line number Diff line Loading @@ -2928,7 +2928,9 @@ public final class ActiveServices { final ProcessServiceRecord clientPsr = b.client.mServices; clientPsr.addConnection(c); c.startAssociationIfNeeded(); if ((c.flags&Context.BIND_ABOVE_CLIENT) != 0) { // Don't set hasAboveClient if binding to self to prevent modifyRawOomAdj() from // dropping the process' adjustment level. if (b.client != s.app && (c.flags & Context.BIND_ABOVE_CLIENT) != 0) { clientPsr.setHasAboveClient(true); } if ((c.flags&Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0) { Loading
services/core/java/com/android/server/am/ProcessServiceRecord.java +2 −1 Original line number Diff line number Diff line Loading @@ -258,7 +258,8 @@ final class ProcessServiceRecord { mHasAboveClient = false; for (int i = mConnections.size() - 1; i >= 0; i--) { ConnectionRecord cr = mConnections.valueAt(i); if ((cr.flags & Context.BIND_ABOVE_CLIENT) != 0) { if (cr.binding.service.app.mServices != this && (cr.flags & Context.BIND_ABOVE_CLIENT) != 0) { mHasAboveClient = true; break; } Loading
services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +23 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,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.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.mockito.AdditionalAnswers.answer; Loading Loading @@ -2208,6 +2209,28 @@ public class MockingOomAdjusterTests { assertProcStates(app2, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services"); } @SuppressWarnings("GuardedBy") @Test public void testUpdateOomAdj_DoOne_AboveClient_SameProcess() { ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true)); doReturn(PROCESS_STATE_TOP).when(sService.mAtmInternal).getTopProcessState(); doReturn(app).when(sService).getTopApp(); sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE); sService.mOomAdjuster.updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_NONE); assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj()); // Simulate binding to a service in the same process using BIND_ABOVE_CLIENT and // verify that its OOM adjustment level is unaffected. bindService(app, app, null, Context.BIND_ABOVE_CLIENT, mock(IBinder.class)); app.mServices.updateHasAboveClientLocked(); assertFalse(app.mServices.hasAboveClient()); sService.mOomAdjuster.updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_NONE); assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj()); } private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName, String packageName, boolean hasShownUi) { long now = SystemClock.uptimeMillis(); Loading