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

Commit e2b1ca7b authored by Michael Wachenschwanz's avatar Michael Wachenschwanz Committed by Android (Google) Code Review
Browse files

Merge "Wrap some calls out of OomAdjuster with the injector" into main

parents 8aa97a97 5125d340
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
        }
    }
}