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

Commit 5125d340 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Wrap some calls out of OomAdjuster with the injector

Small step to preparing OomAdjuster to be compartmentalized from the
rest of the system. Also update the tests to also validate OomAdjuster
actually tries to send oomscore updates to lmkd.

Flag: EXEMPTED bugfix
Test: atest MockingOomAdjuster
Fixes: 364792232
Bug: 346822474
Change-Id: I38817d64262d15b8e871979e3bd143520e570959
parent bb3f3fe7
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -1436,7 +1448,7 @@ public class OomAdjuster {
        }

        if (!mProcsToOomAdj.isEmpty()) {
            ProcessList.batchSetOomAdj(mProcsToOomAdj);
            mInjector.batchSetOomAdj(mProcsToOomAdj);
            mProcsToOomAdj.clear();
        }

@@ -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) {
@@ -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
@@ -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) {
@@ -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;
+59 −45
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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) {
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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")
@@ -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.
@@ -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 {
@@ -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;
@@ -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();
@@ -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
        }
    }
}