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

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

Decouple ProcessStateRecord from ProcessRecord

Introduce interfaces to decouple ProcessStateRecord from direct
dependencies on ProcessRecord and ActivityManagerService.
- ProcessRecord now implements ProcessStateRecord.StatePuller
  to provide necessary info for OOM adjustment calculations.
- ProcessProfileRecord implements
  ProcessStateRecord.StartedServiceObserver
  to react to changes in component-related states (activities, services,
  broadcasts) and update hosting component types accordingly.

Bug: 425766486
Test: mmm frameworks/base/services/
Test: atest MockingOomAdjusterTests
Flag: EXEMPT pure refactor

Change-Id: I996ceb3418b9bcf1c77d3e89f09510bbc536fa58
parent 7400289b
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.server.am;

import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_ACTIVITY;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_EMPTY;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_STARTED_SERVICE;

@@ -741,4 +743,22 @@ final class ProcessProfileRecord implements ProcessStateRecord.StartedServiceObs
            clearHostingComponentType(HOSTING_COMPONENT_TYPE_STARTED_SERVICE);
        }
    }

    @Override
    public void onIsReceivingBroadcastChanged(boolean isReceivingBroadcast) {
        if (isReceivingBroadcast) {
            addHostingComponentType(HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER);
        } else {
            clearHostingComponentType(HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER);
        }
    }

    @Override
    public void onHasActivitiesChanged(boolean hasActivities) {
        if (hasActivities) {
            addHostingComponentType(HOSTING_COMPONENT_TYPE_ACTIVITY);
        } else {
            clearHostingComponentType(HOSTING_COMPONENT_TYPE_ACTIVITY);
        }
    }
}
+41 −6
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.os.Zygote;
import com.android.server.FgThread;
import com.android.server.am.OomAdjusterImpl.ProcessRecordNode;
import com.android.server.am.psc.PlatformCompatCache.CachedCompatChangeId;
import com.android.server.wm.WindowProcessController;
import com.android.server.wm.WindowProcessListener;

@@ -79,7 +80,7 @@ import java.util.function.Consumer;
 * Full information about a particular process that
 * is currently running.
 */
class ProcessRecord implements WindowProcessListener {
class ProcessRecord implements WindowProcessListener, ProcessStateRecord.ProcessRecordReader {
    static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessRecord" : TAG_AM;

    final ActivityManagerService mService; // where we came from
@@ -626,7 +627,8 @@ class ProcessRecord implements WindowProcessListener {
        mErrorState = new ProcessErrorStateRecord(this);
        mWindowProcessController = new WindowProcessController(
                mService.mActivityTaskManager, info, processName, uid, userId, this, this);
        mState = new ProcessStateRecord(processName, uid, mWindowProcessController, mProfile, this);
        mState = new ProcessStateRecord(processName, uid, mWindowProcessController, mProfile, this,
                mService, mService.mProcLock);
        mOptRecord = new ProcessCachedOptimizerRecord(this);
        final long now = SystemClock.uptimeMillis();
        mProfile.init(now);
@@ -1171,18 +1173,51 @@ class ProcessRecord implements WindowProcessListener {
        return mState.isCached();
    }

    boolean hasActivities() {
    @Override
    public boolean hasActivities() {
        return mWindowProcessController.hasActivities();
    }

    boolean hasActivitiesOrRecentTasks() {
        return mWindowProcessController.hasActivitiesOrRecentTasks();
    @Override
    public boolean isHeavyWeightProcess() {
        return mWindowProcessController.isHeavyWeightProcess();
    }

    @Override
    public boolean hasVisibleActivities() {
        return mWindowProcessController.hasVisibleActivities();
    }

    @Override
    public boolean isHomeProcess() {
        return mWindowProcessController.isHomeProcess();
    }

    @Override
    public boolean isPreviousProcess() {
        return mWindowProcessController.isPreviousProcess();
    }

    boolean hasRecentTasks() {
    @Override
    public boolean hasRecentTasks() {
        return mWindowProcessController.hasRecentTasks();
    }

    @Override
    public boolean isReceivingBroadcast(int[] outSchedGroup) {
        return mService.isReceivingBroadcastLocked(this, outSchedGroup);
    }

    @Override
    public boolean hasCompatChange(@CachedCompatChangeId int cachedCompatChangeId) {
        return mService.mOomAdjuster.isChangeEnabled(cachedCompatChangeId, info,
                false/* default */);
    }

    boolean hasActivitiesOrRecentTasks() {
        return mWindowProcessController.hasActivitiesOrRecentTasks();
    }

    @GuardedBy("mService")
    public ApplicationInfo getApplicationInfo() {
        return info;
+310 −249

File changed.

Preview size limit exceeded, changes collapsed.