Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac57e889 authored by Tomislav Novak's avatar Tomislav Novak Committed by Jing Ji
Browse files

Revert^2 "Ignore BIND_ABOVE_CLIENT for same-process connections"

Binding to a service using BIND_ABOVE_CLIENT affects the OOM adjustment
of both the client and the service; client's value is dropped by one
level in modifyRawOomAdj() to make sure it's lower than the service's.

Doing this unconditionally, however, means that the process' OOM score
will be reduced if binding to a service that lives in the same process
as the client. For example, a top app would have its oom_score_adj set
to 100 (visible) rather than 0 (foreground).

This is a resubmission of aosp/2577299 with a missing null check added
(see aosp/2650877) and an additional test.

Test: atest MockingOomAdjusterTests
Change-Id: I405e7d8b0cfbb755a4f3d5165f596fae15d9907c
parent d4d5d54c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -347,8 +347,10 @@ final class ProcessServiceRecord {
        mHasAboveClient = false;
        for (int i = mConnections.size() - 1; i >= 0; i--) {
            ConnectionRecord cr = mConnections.valueAt(i);
            if (cr.binding.service.app.mServices != this
                    && cr.hasFlag(Context.BIND_ABOVE_CLIENT)) {

            final boolean isSameProcess = cr.binding.service.app != null
                    && cr.binding.service.app.mServices == this;
            if (!isSameProcess && cr.hasFlag(Context.BIND_ABOVE_CLIENT)) {
                mHasAboveClient = true;
                break;
            }
+25 −0
Original line number Diff line number Diff line
@@ -2617,6 +2617,31 @@ public class MockingOomAdjusterTests {
        assertTrue(CACHED_APP_MAX_ADJ >= app3.mState.getSetAdj());
    }

    @SuppressWarnings("GuardedBy")
    @Test
    public void testUpdateOomAdj_DoOne_AboveClient_NotStarted() {
        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, OOM_ADJ_REASON_NONE);

        assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());

        // Start binding to a service that isn't running yet.
        ServiceRecord sr = makeServiceRecord(app);
        sr.app = null;
        bindService(null, app, sr, Context.BIND_ABOVE_CLIENT, mock(IBinder.class));

        // Since sr.app is null, this service cannot be in the same process as the
        // client so we expect the BIND_ABOVE_CLIENT adjustment to take effect.
        app.mServices.updateHasAboveClientLocked();
        sService.mOomAdjuster.updateOomAdjLocked(app, OOM_ADJ_REASON_NONE);
        assertTrue(app.mServices.hasAboveClient());
        assertNotEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());
    }

    private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName,
            String packageName, boolean hasShownUi) {
        long now = SystemClock.uptimeMillis();