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

Commit 3e348ff7 authored by Hui Yu's avatar Hui Yu Committed by Android (Google) Code Review
Browse files

Merge "Set unfreeze_reason to statsd atom AppFreezeChanged."

parents b203ed94 cc09492d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -17507,7 +17507,8 @@ public class ActivityManagerService extends IActivityManager.Stub
            // sends to the activity. After this race issue between WM/ATMS and AMS is solved, this
            // workaround can be removed. (b/213288355)
            if (isNewPending) {
                mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid);
                mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid,
                        OomAdjuster.OOM_ADJ_REASON_ACTIVITY);
            }
            // We need to update the network rules for the app coming to the top state so that
            // it can access network when the device or the app is in a restricted state
+8 −5
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU;
import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER;
import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_START_RECEIVER;


import android.annotation.NonNull;
@@ -348,7 +350,7 @@ public final class BroadcastQueue {
        // Force an update, even if there are other pending requests, overall it still saves time,
        // because time(updateOomAdj(N apps)) <= N * time(updateOomAdj(1 app)).
        mService.enqueueOomAdjTargetLocked(app);
        mService.updateOomAdjPendingTargetsLocked(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER);
        mService.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_RECEIVER);

        // Tell the application to launch this receiver.
        maybeReportBroadcastDispatchedEventLocked(r, r.curReceiver.applicationInfo.uid);
@@ -976,10 +978,11 @@ public final class BroadcastQueue {
                filter.receiverList.app.mReceivers.addCurReceiver(r);
                mService.enqueueOomAdjTargetLocked(r.curApp);
                mService.updateOomAdjPendingTargetsLocked(
                        OomAdjuster.OOM_ADJ_REASON_START_RECEIVER);
                        OOM_ADJ_REASON_START_RECEIVER);
            }
        } else if (filter.receiverList.app != null) {
            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app);
            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app,
                    OOM_ADJ_REASON_START_RECEIVER);
        }

        try {
@@ -1263,7 +1266,7 @@ public final class BroadcastQueue {
                    // make sure all processes have correct oom and sched
                    // adjustments.
                    mService.updateOomAdjPendingTargetsLocked(
                            OomAdjuster.OOM_ADJ_REASON_START_RECEIVER);
                            OOM_ADJ_REASON_START_RECEIVER);
                }

                // when we have no more ordered broadcast on this queue, stop logging
@@ -1345,7 +1348,7 @@ public final class BroadcastQueue {
                    if (sendResult) {
                        if (r.callerApp != null) {
                            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(
                                    r.callerApp);
                                    r.callerApp, OOM_ADJ_REASON_FINISH_RECEIVER);
                        }
                        try {
                            if (DEBUG_BROADCAST) {
+54 −28
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.provider.DeviceConfig.Properties;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -904,7 +905,7 @@ public final class CachedAppOptimizer {
                    }

                    if (!enable && opt.isFrozen()) {
                        unfreezeAppLSP(process);
                        unfreezeAppLSP(process, OomAdjuster.OOM_ADJ_REASON_NONE);

                        // Set freezerOverride *after* calling unfreezeAppLSP (it resets the flag)
                        opt.setFreezerOverride(true);
@@ -1214,11 +1215,11 @@ public final class CachedAppOptimizer {

    // This will ensure app will be out of the freezer for at least mFreezerDebounceTimeout.
    @GuardedBy("mAm")
    void unfreezeTemporarily(ProcessRecord app) {
    void unfreezeTemporarily(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
        if (mUseFreezer) {
            synchronized (mProcLock) {
                if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) {
                    unfreezeAppLSP(app);
                    unfreezeAppLSP(app, reason);
                    freezeAppAsyncLSP(app);
                }
            }
@@ -1244,7 +1245,7 @@ public final class CachedAppOptimizer {
    }

    @GuardedBy({"mAm", "mProcLock", "mFreezerLock"})
    void unfreezeAppInternalLSP(ProcessRecord app) {
    void unfreezeAppInternalLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
        final int pid = app.getPid();
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        if (opt.isPendingFreeze()) {
@@ -1325,14 +1326,14 @@ public final class CachedAppOptimizer {
                    mFreezeHandler.obtainMessage(REPORT_UNFREEZE_MSG,
                        pid,
                        (int) Math.min(opt.getFreezeUnfreezeTime() - freezeTime, Integer.MAX_VALUE),
                        app.processName));
                        new Pair<String, Integer>(app.processName, reason)));
        }
    }

    @GuardedBy({"mAm", "mProcLock"})
    void unfreezeAppLSP(ProcessRecord app) {
    void unfreezeAppLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
        synchronized (mFreezerLock) {
            unfreezeAppInternalLSP(app);
            unfreezeAppInternalLSP(app, reason);
        }
    }

@@ -1343,25 +1344,14 @@ public final class CachedAppOptimizer {
     * The caller of this function should still trigger updateOomAdj for AMS to unfreeze the app.
     * @param pid pid of the process to be unfrozen
     */
    void unfreezeProcess(int pid) {
    void unfreezeProcess(int pid, @OomAdjuster.OomAdjReason int reason) {
        synchronized (mFreezerLock) {
            ProcessRecord app = mFrozenProcesses.get(pid);
            if (app == null) {
                return;
            }
            Slog.d(TAG_AM, "quick sync unfreeze " + pid);
            try {
                freezeBinder(pid, false);
            } catch (RuntimeException e) {
                Slog.e(TAG_AM, "Unable to quick unfreeze binder for " + pid);
                return;
            }

            try {
                Process.setProcessFrozen(pid, app.uid, false);
            } catch (Exception e) {
                Slog.e(TAG_AM, "Unable to quick unfreeze " + pid);
            }
            unfreezeAppLSP(app, reason);
        }
    }

@@ -1880,9 +1870,11 @@ public final class CachedAppOptimizer {
                case REPORT_UNFREEZE_MSG:
                    int pid = msg.arg1;
                    int frozenDuration = msg.arg2;
                    String processName = (String) msg.obj;
                    Pair<String, Integer> obj = (Pair<String, Integer>) msg.obj;
                    String processName = obj.first;
                    int reason = obj.second;

                    reportUnfreeze(pid, frozenDuration, processName);
                    reportUnfreeze(pid, frozenDuration, processName, reason);
                    break;
                default:
                    return;
@@ -1893,7 +1885,7 @@ public final class CachedAppOptimizer {
        private void rescheduleFreeze(final ProcessRecord proc, final String reason) {
            Slog.d(TAG_AM, "Reschedule freeze for process " + proc.getPid()
                    + " " + proc.processName + " (" + reason + ")");
            unfreezeAppLSP(proc);
            unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
            freezeAppAsyncLSP(proc);
        }

@@ -1981,7 +1973,8 @@ public final class CachedAppOptimizer {
                        FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP,
                        pid,
                        name,
                        unfrozenDuration);
                        unfrozenDuration,
                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE);
            }

            try {
@@ -2011,12 +2004,13 @@ public final class CachedAppOptimizer {
            } catch (Exception e) {
                Slog.e(TAG_AM, "Unable to check file locks for " + name + "(" + pid + "): " + e);
                synchronized (mProcLock) {
                    unfreezeAppLSP(proc);
                    unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
                }
            }
        }

        private void reportUnfreeze(int pid, int frozenDuration, String processName) {
        private void reportUnfreeze(int pid, int frozenDuration, String processName,
                @OomAdjuster.OomAdjReason int reason) {

            EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName);

@@ -2027,7 +2021,39 @@ public final class CachedAppOptimizer {
                        FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP,
                        pid,
                        processName,
                        frozenDuration);
                        frozenDuration,
                        getUnfreezeReasonCode(reason));
            }
        }

        private int getUnfreezeReasonCode(@OomAdjuster.OomAdjReason int oomAdjReason) {
            switch (oomAdjReason) {
                case OomAdjuster.OOM_ADJ_REASON_ACTIVITY:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ACTIVITY;
                case OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__FINISH_RECEIVER;
                case OomAdjuster.OOM_ADJ_REASON_START_RECEIVER:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_RECEIVER;
                case OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__BIND_SERVICE;
                case OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UNBIND_SERVICE;
                case OomAdjuster.OOM_ADJ_REASON_START_SERVICE:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_SERVICE;
                case OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__GET_PROVIDER;
                case OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__REMOVE_PROVIDER;
                case OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UI_VISIBILITY;
                case OomAdjuster.OOM_ADJ_REASON_ALLOWLIST:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ALLOWLIST;
                case OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_BEGIN;
                case OomAdjuster.OOM_ADJ_REASON_PROCESS_END:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_END;
                default:
                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE;
            }
        }

@@ -2041,7 +2067,7 @@ public final class CachedAppOptimizer {
                ProcessRecord app = mFrozenProcesses.get(pid);
                if (app != null) {
                    Slog.i(TAG_AM, app.processName + " (" + pid + ") holds blocking file lock");
                    unfreezeAppLSP(app);
                    unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE);
                }
            }
        }
+13 −12
Original line number Diff line number Diff line
@@ -448,7 +448,7 @@ public class OomAdjuster {
     */
    @GuardedBy({"mService", "mProcLock"})
    private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj,
            ProcessRecord topApp, long now) {
            ProcessRecord topApp, long now, @OomAdjReason int oomAdjReason) {
        if (app.getThread() == null) {
            return false;
        }
@@ -492,7 +492,7 @@ public class OomAdjuster {
            }
        }

        return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime());
        return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason);
    }

    /**
@@ -592,7 +592,7 @@ public class OomAdjuster {
        mPendingProcessSet.remove(app);
        app.mOptRecord.setLastOomAdjChangeReason(oomAdjReason);
        boolean success = performUpdateOomAdjLSP(app, cachedAdj, topApp,
                SystemClock.uptimeMillis());
                SystemClock.uptimeMillis(), oomAdjReason);
        // The 'app' here itself might or might not be in the cycle, for example,
        // the case A <=> B vs. A -> B <=> C; anyway, if we spot a cycle here, re-compute them.
        if (!success || (wasCached == state.isCached() && oldAdj != ProcessList.INVALID_ADJ
@@ -645,7 +645,7 @@ public class OomAdjuster {
            processes.add(app);
            assignCachedAdjIfNecessary(processes);
            applyOomAdjLSP(app, false, SystemClock.uptimeMillis(),
                    SystemClock.elapsedRealtime());
                    SystemClock.elapsedRealtime(), oomAdjReason);
        }
        mTmpProcessList.clear();
        mService.mOomAdjProfiler.oomAdjEnded();
@@ -941,7 +941,8 @@ public class OomAdjuster {
        mNumNonCachedProcs = 0;
        mNumCachedHiddenProcs = 0;

        boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids);
        boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids,
                oomAdjReason);
        mNumServiceProcs = mNewNumServiceProcs;

        if (mService.mAlwaysFinishActivities) {
@@ -1119,7 +1120,7 @@ public class OomAdjuster {

    @GuardedBy({"mService", "mProcLock"})
    private boolean updateAndTrimProcessLSP(final long now, final long nowElapsed,
            final long oldTime, final ActiveUids activeUids) {
            final long oldTime, final ActiveUids activeUids, @OomAdjReason int oomAdjReason) {
        ArrayList<ProcessRecord> lruList = mProcessList.getLruProcessesLOSP();
        final int numLru = lruList.size();

@@ -1147,7 +1148,7 @@ public class OomAdjuster {
            if (!app.isKilledByAm() && app.getThread() != null) {
                // We don't need to apply the update for the process which didn't get computed
                if (state.getCompletedAdjSeq() == mAdjSeq) {
                    applyOomAdjLSP(app, true, now, nowElapsed);
                    applyOomAdjLSP(app, true, now, nowElapsed, oomAdjReason);
                }

                final ProcessServiceRecord psr = app.mServices;
@@ -2640,7 +2641,7 @@ public class OomAdjuster {
    /** Applies the computed oomadj, procstate and sched group values and freezes them in set* */
    @GuardedBy({"mService", "mProcLock"})
    private boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now,
            long nowElapsed) {
            long nowElapsed, @OomAdjReason int oomAdjReson) {
        boolean success = true;
        final ProcessStateRecord state = app.mState;
        final UidRecord uidRec = app.getUidRecord();
@@ -2799,7 +2800,7 @@ public class OomAdjuster {
            changes |= ActivityManagerService.ProcessChangeItem.CHANGE_ACTIVITIES;
        }

        updateAppFreezeStateLSP(app);
        updateAppFreezeStateLSP(app, oomAdjReson);

        if (state.getReportedProcState() != state.getCurProcState()) {
            state.setReportedProcState(state.getCurProcState());
@@ -3160,7 +3161,7 @@ public class OomAdjuster {
    }

    @GuardedBy({"mService", "mProcLock"})
    private void updateAppFreezeStateLSP(ProcessRecord app) {
    private void updateAppFreezeStateLSP(ProcessRecord app, @OomAdjReason int oomAdjReason) {
        if (!mCachedAppOptimizer.useFreezer()) {
            return;
        }
@@ -3172,7 +3173,7 @@ public class OomAdjuster {
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
        if (opt.isFrozen() && opt.shouldNotFreeze()) {
            mCachedAppOptimizer.unfreezeAppLSP(app);
            mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
            return;
        }

@@ -3182,7 +3183,7 @@ public class OomAdjuster {
                && !opt.shouldNotFreeze()) {
            mCachedAppOptimizer.freezeAppAsyncLSP(app);
        } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
            mCachedAppOptimizer.unfreezeAppLSP(app);
            mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
        }
    }
}