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

Commit af5451f0 authored by Chris Morin's avatar Chris Morin
Browse files

OOM score management

Add 2 additional attirubte |isFocused| and |lastActivityTime| in
ActivityManager.RunningAppProcessInfo and pass them to Chrome via IPC
so Chrome can better prioritize ARC processes.

Bug: 29576205
Test: Ensure new process information is passed to Chrome.

Change-Id: Ic88d5fca336f03bd6426e65f964236130bb83fb6
parent 114fcb41
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -3080,16 +3080,32 @@ public class ActivityManager {
         */
        public int processState;

        /**
         * Whether the app is focused in multi-window environment.
         * @hide
         */
        public boolean isFocused;

        /**
         * Copy of {@link com.android.server.am.ProcessRecord#lastActivityTime} of the process.
         * @hide
         */
        public long lastActivityTime;

        public RunningAppProcessInfo() {
            importance = IMPORTANCE_FOREGROUND;
            importanceReasonCode = REASON_UNKNOWN;
            processState = PROCESS_STATE_IMPORTANT_FOREGROUND;
            isFocused = false;
            lastActivityTime = 0;
        }

        public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
            processName = pProcessName;
            pid = pPid;
            pkgList = pArr;
            isFocused = false;
            lastActivityTime = 0;
        }

        public int describeContents() {
@@ -3110,6 +3126,8 @@ public class ActivityManager {
            ComponentName.writeToParcel(importanceReasonComponent, dest);
            dest.writeInt(importanceReasonImportance);
            dest.writeInt(processState);
            dest.writeInt(isFocused ? 1 : 0);
            dest.writeLong(lastActivityTime);
        }

        public void readFromParcel(Parcel source) {
@@ -3126,6 +3144,8 @@ public class ActivityManager {
            importanceReasonComponent = ComponentName.readFromParcel(source);
            importanceReasonImportance = source.readInt();
            processState = source.readInt();
            isFocused = source.readInt() != 0;
            lastActivityTime = source.readLong();
        }

        public static final Creator<RunningAppProcessInfo> CREATOR =
+16 −12
Original line number Diff line number Diff line
@@ -12494,7 +12494,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        return imp;
    }
    private void fillInProcMemInfo(ProcessRecord app,
    private void fillInProcMemInfoLocked(ProcessRecord app,
            ActivityManager.RunningAppProcessInfo outInfo,
            int clientTargetSdk) {
        outInfo.pid = app.pid;
@@ -12514,6 +12514,8 @@ public class ActivityManagerService extends IActivityManager.Stub
        outInfo.importance = procStateToImportance(procState, adj, outInfo, clientTargetSdk);
        outInfo.importanceReasonCode = app.adjTypeCode;
        outInfo.processState = app.curProcState;
        outInfo.isFocused = (app == getTopAppLocked());
        outInfo.lastActivityTime = app.lastActivityTime;
    }
    @Override
@@ -12544,7 +12546,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                    ActivityManager.RunningAppProcessInfo currApp =
                        new ActivityManager.RunningAppProcessInfo(app.processName,
                                app.pid, app.getPackageList());
                    fillInProcMemInfo(app, currApp, clientTargetSdk);
                    fillInProcMemInfoLocked(app, currApp, clientTargetSdk);
                    if (app.adjSource instanceof ProcessRecord) {
                        currApp.importanceReasonPid = ((ProcessRecord)app.adjSource).pid;
                        currApp.importanceReasonImportance =
@@ -12613,7 +12615,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                proc = mPidsSelfLocked.get(Binder.getCallingPid());
            }
            if (proc != null) {
                fillInProcMemInfo(proc, outState, clientTargetSdk);
                fillInProcMemInfoLocked(proc, outState, clientTargetSdk);
            }
        }
    }
@@ -21045,21 +21047,23 @@ public class ActivityManagerService extends IActivityManager.Stub
    }
    @GuardedBy("this")
    final void updateOomAdjLocked() {
    ProcessRecord getTopAppLocked() {
        final ActivityRecord TOP_ACT = resumedAppLocked();
        final ProcessRecord TOP_APP = TOP_ACT != null && TOP_ACT.hasProcess()
                ? (ProcessRecord) TOP_ACT.app.mOwner : null;
        if (TOP_ACT != null && TOP_ACT.hasProcess()) {
            return (ProcessRecord) TOP_ACT.app.mOwner;
        } else {
            return null;
        }
    }
    @GuardedBy("this")
    final void updateOomAdjLocked() {
        final ProcessRecord TOP_APP = getTopAppLocked();
        final long now = SystemClock.uptimeMillis();
        final long nowElapsed = SystemClock.elapsedRealtime();
        final long oldTime = now - ProcessList.MAX_EMPTY_TIME;
        final int N = mLruProcesses.size();
        if (false) {
            RuntimeException e = new RuntimeException();
            e.fillInStackTrace();
            Slog.i(TAG, "updateOomAdj: top=" + TOP_ACT, e);
        }
        // Reset state in all uid records.
        for (int i=mActiveUids.size()-1; i>=0; i--) {
            final UidRecord uidRec = mActiveUids.valueAt(i);