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

Commit b0bfc6aa authored by Chih-Yu Huang's avatar Chih-Yu Huang
Browse files

am: Add OomAdjuster.Callback interface

This CL adds the OomAdjuster.Callback interface to decouple OomAdjuster
from direct dependencies on the am package. Some of the
CachedAppOptimizer functionality is now wrapped within an implementation
of this new interface.

Bug: 441178013
Test: m services.core
Test: atest MockingOomAdjusterTests OomAdjusterTests
Test: atest FrameworksServicesTestsRavenwood_ProcessStateController
Test: atest ProcessStateControllerTest
Flag: EXEMPT PURE_REFACTOR

Change-Id: I7750b785f5a516d0a31415be2e829302745d7357
parent 18e01a69
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -456,6 +456,7 @@ import com.android.server.ThreadPriorityBooster;
import com.android.server.UiThread;
import com.android.server.Watchdog;
import com.android.server.am.LowMemDetector.MemFactor;
import com.android.server.am.psc.ProcessRecordInternal;
import com.android.server.appop.AppOpsService;
import com.android.server.compat.PlatformCompat;
import com.android.server.contentcapture.ContentCaptureManagerInternal;
@@ -2425,7 +2426,8 @@ public class ActivityManagerService extends IActivityManager.Stub
        mPhantomProcessList = new PhantomProcessList(this);
        mCachedAppOptimizer = new CachedAppOptimizer(this);
        mProcessStateController = new ProcessStateController.Builder(this, mProcessList, activeUids)
        mProcessStateController = new ProcessStateController
                .Builder(this, mProcessList, activeUids, new OomAdjusterCallback())
                .setHandlerThread(handlerThread)
                .build();
        mOomAdjuster = mProcessStateController.getOomAdjuster();
@@ -2494,7 +2496,8 @@ public class ActivityManagerService extends IActivityManager.Stub
        mPhantomProcessList = new PhantomProcessList(this);
        final Looper activityTaskLooper = DisplayThread.get().getLooper();
        mCachedAppOptimizer = new CachedAppOptimizer(this);
        mProcessStateController = new ProcessStateController.Builder(this, mProcessList, activeUids)
        mProcessStateController = new ProcessStateController
                .Builder(this, mProcessList, activeUids, new OomAdjusterCallback())
                .setLockObject(this)
                .setTopProcessChangeCallback(this::updateTopAppListeners)
                .setProcessLruUpdater(mProcessList)
@@ -7529,6 +7532,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                reportCurWakefulnessUsageEvent();
                mActivityTaskManager.onScreenAwakeChanged(isAwake);
                mProcessStateController.setWakefulness(wakefulness);
                mCachedAppOptimizer.onWakefulnessChanged(wakefulness);
                updateOomAdjLocked(OOM_ADJ_REASON_UI_VISIBILITY);
            }
@@ -19336,6 +19340,25 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
    }
    /**
     * The default implementation of {@link OomAdjuster.Callback}.
     *
     * <p>This class acts as a proxy for {@link ActivityManagerService}, providing
     * {@link OomAdjuster} with access to functionalities that are external to the psc package.
     * As the boundary between the `psc` and `am` packages, it consolidates all type casting from
     * the `psc` internal record classes to their concrete counterparts. This type cast is safe
     * because there is only one production implementation.
     */
    @VisibleForTesting
    final class OomAdjusterCallback implements OomAdjuster.Callback {
        @Override
        @GuardedBy({"ActivityManagerService.this", "ActivityManagerService.this.mProcLock"})
        public void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecordInternal app) {
            mCachedAppOptimizer.onOomAdjustChanged(oldAdj, newAdj, (ProcessRecord) app);
        }
    }
    CachedAppOptimizer getCachedAppOptimizer() {
        return mCachedAppOptimizer;
    }
+1 −0
Original line number Diff line number Diff line
@@ -1380,6 +1380,7 @@ public class ContentProviderHelper {
        mService.mActivityTaskManager.installSystemProviders();
        new DevelopmentSettingsObserver(); // init to observe developer settings enable/disable
        SettingsToPropertiesMapper.start(mService.mContext.getContentResolver());
        mService.getCachedAppOptimizer().init();
        mService.mOomAdjuster.initSettings();

        // Now that the settings provider is published we can consider sending in a rescue party.
+14 −8
Original line number Diff line number Diff line
@@ -320,6 +320,7 @@ public abstract class OomAdjuster {

    protected final int[] mTmpSchedGroup = new int[1];

    final Callback mCallback;
    final ActivityManagerService mService;
    final Injector mInjector;
    final GlobalState mGlobalState;
@@ -388,6 +389,15 @@ public abstract class OomAdjuster {
    static final int ALL_CPU_TIME_CAPABILITIES =
            PROCESS_CAPABILITY_CPU_TIME | PROCESS_CAPABILITY_IMPLICIT_CPU_TIME;

    /**
     * Callback interface for {@link OomAdjuster} to interact with components outside the PSC
     * package, abstracting away direct dependencies.
     */
    public interface Callback {
        /** Notifies the client component when a process's OOM adjustment changes. */
        void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecordInternal appInternal);
    }

    @VisibleForTesting
    public static class Injector {
        boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId,
@@ -468,7 +478,9 @@ public abstract class OomAdjuster {
    }

    OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids,
            ServiceThread adjusterThread, GlobalState globalState, Injector injector) {
            ServiceThread adjusterThread, GlobalState globalState, Injector injector,
            Callback callback) {
        mCallback = callback;
        mService = service;
        mGlobalState = globalState;
        mInjector = injector;
@@ -522,7 +534,6 @@ public abstract class OomAdjuster {
    }

    void initSettings() {
        mService.getCachedAppOptimizer().init();
        if (mService.mConstants.KEEP_WARMING_SERVICES.size() > 0) {
            final IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
            mService.mContext.registerReceiverForAllUsers(new BroadcastReceiver() {
@@ -2060,10 +2071,6 @@ public abstract class OomAdjuster {
        mService.reportOomAdjMessageLocked(msg);
    }

    void onWakefulnessChanged(int wakefulness) {
        mService.getCachedAppOptimizer().onWakefulnessChanged(wakefulness);
    }

    /** Applies the computed oomadj, procstate and sched group values and freezes them in set* */
    @GuardedBy({"mService", "mProcLock"})
    protected boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now,
@@ -2082,8 +2089,7 @@ public abstract class OomAdjuster {
        int changes = 0;

        if (state.getCurAdj() != state.getSetAdj()) {
            mService.getCachedAppOptimizer().onOomAdjustChanged(state.getSetAdj(),
                    state.getCurAdj(), app);
            mCallback.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);
        }

        final int oldOomAdj = state.getSetAdj();
+2 −2
Original line number Diff line number Diff line
@@ -658,8 +658,8 @@ public class OomAdjusterImpl extends OomAdjuster {

    OomAdjusterImpl(ActivityManagerService service, ProcessList processList,
            ActiveUids activeUids, ServiceThread adjusterThread, GlobalState globalState,
            Injector injector) {
        super(service, processList, activeUids, adjusterThread, globalState, injector);
            Injector injector, Callback callback) {
        super(service, processList, activeUids, adjusterThread, globalState, injector, callback);
    }

    private final ProcessRecordNodes mProcessRecordProcStateNodes = new ProcessRecordNodes(
+9 −5
Original line number Diff line number Diff line
@@ -83,9 +83,10 @@ public class ProcessStateController {
    private ProcessStateController(ActivityManagerService ams, ProcessList processList,
            ActiveUids activeUids, ServiceThread handlerThread,
            Object lock, Object procLock, Consumer<ProcessRecord> topChangeCallback,
            ProcessLruUpdater lruUpdater, OomAdjuster.Injector oomAdjInjector) {
            ProcessLruUpdater lruUpdater, OomAdjuster.Injector oomAdjInjector,
            OomAdjuster.Callback callback) {
        mOomAdjuster = new OomAdjusterImpl(ams, processList, activeUids, handlerThread,
                mGlobalState, oomAdjInjector);
                mGlobalState, oomAdjInjector, callback);

        mLock = lock;
        mProcLock = procLock;
@@ -376,7 +377,6 @@ public class ProcessStateController {
    @GuardedBy("mLock")
    public void setWakefulness(int wakefulness) {
        mGlobalState.mIsAwake = (wakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE);
        mOomAdjuster.onWakefulnessChanged(wakefulness);
    }

    /**
@@ -1121,6 +1121,7 @@ public class ProcessStateController {
        private final ActivityManagerService mAms;
        private final ProcessList mProcessList;
        private final ActiveUids mActiveUids;
        private final OomAdjuster.Callback mOomAdjCallback;

        private ServiceThread mHandlerThread = null;
        private Object mLock = null;
@@ -1128,10 +1129,12 @@ public class ProcessStateController {
        private ProcessLruUpdater mProcessLruUpdater = null;
        private OomAdjuster.Injector mOomAdjInjector = null;

        public Builder(ActivityManagerService ams, ProcessList processList, ActiveUids activeUids) {
        public Builder(ActivityManagerService ams, ProcessList processList, ActiveUids activeUids,
                OomAdjuster.Callback oomAdjCallback) {
            mAms = ams;
            mProcessList = processList;
            mActiveUids = activeUids;
            mOomAdjCallback = oomAdjCallback;
        }

        /**
@@ -1159,7 +1162,8 @@ public class ProcessStateController {
                mOomAdjInjector = new OomAdjuster.Injector();
            }
            return new ProcessStateController(mAms, mProcessList, mActiveUids, mHandlerThread,
                    mLock, mAms.mProcLock, mTopChangeCallback, mProcessLruUpdater, mOomAdjInjector);
                    mLock, mAms.mProcLock, mTopChangeCallback, mProcessLruUpdater, mOomAdjInjector,
                    mOomAdjCallback);
        }

        /**
Loading