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

Commit 9ca9051e authored by Jing Ji's avatar Jing Ji Committed by Automerger Merge Worker
Browse files

Merge "Add dedicated unfreeze reason code" into udc-dev am: c2cccad6

parents c72e2356 c2cccad6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18780,7 +18780,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                    final IApplicationThread thread = app.getOnewayThread();
                    if (thread != null) {
                        mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(app,
                                OomAdjuster.OOM_ADJ_REASON_NONE);
                                CachedAppOptimizer.UNFREEZE_REASON_PING);
                        pingCount.incrementAndGet();
                        try {
                            thread.schedulePing(pongCallback);
+1 −2
Original line number Diff line number Diff line
@@ -45,7 +45,6 @@ import static com.android.server.am.ActivityManagerService.appendMemInfo;
import static com.android.server.am.ActivityManagerService.getKsmInfo;
import static com.android.server.am.ActivityManagerService.stringifyKBSize;
import static com.android.server.am.LowMemDetector.ADJ_MEM_FACTOR_NOTHING;
import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_NONE;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
import static com.android.server.wm.ActivityTaskManagerService.DUMP_ACTIVITIES_CMD;

@@ -1119,7 +1118,7 @@ public class AppProfiler {
                    Slog.v(TAG_OOM_ADJ, msg + app.processName + " to " + level);
                }
                mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(app,
                        OOM_ADJ_REASON_NONE);
                        CachedAppOptimizer.UNFREEZE_REASON_TRIM_MEMORY);
                thread.scheduleTrimMemory(level);
            } catch (RemoteException e) {
            }
+3 −3
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_L
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
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;
@@ -837,7 +836,7 @@ public class BroadcastQueueImpl extends BroadcastQueue {
            }
        } else if (filter.receiverList.app != null) {
            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app,
                    OOM_ADJ_REASON_START_RECEIVER);
                    CachedAppOptimizer.UNFREEZE_REASON_START_RECEIVER);
        }

        try {
@@ -1131,7 +1130,8 @@ public class BroadcastQueueImpl extends BroadcastQueue {
                    if (sendResult) {
                        if (r.callerApp != null) {
                            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(
                                    r.callerApp, OOM_ADJ_REASON_FINISH_RECEIVER);
                                    r.callerApp,
                                    CachedAppOptimizer.UNFREEZE_REASON_FINISH_RECEIVER);
                        }
                        try {
                            if (DEBUG_BROADCAST) {
+2 −3
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import static com.android.server.am.BroadcastRecord.getReceiverPackageName;
import static com.android.server.am.BroadcastRecord.getReceiverProcessName;
import static com.android.server.am.BroadcastRecord.getReceiverUid;
import static com.android.server.am.BroadcastRecord.isDeliveryStateTerminal;
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;
@@ -929,7 +928,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        final IApplicationThread thread = (app != null) ? app.getOnewayThread() : null;
        if (thread != null) {
            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(
                    app, OOM_ADJ_REASON_FINISH_RECEIVER);
                    app, CachedAppOptimizer.UNFREEZE_REASON_FINISH_RECEIVER);
            if (r.shareIdentity && app.uid != r.callingUid) {
                mService.mPackageManagerInt.grantImplicitAccess(r.userId, r.intent,
                        UserHandle.getAppId(app.uid), r.callingUid, true);
@@ -1515,7 +1514,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            }

            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(queue.app,
                    OOM_ADJ_REASON_START_RECEIVER);
                    CachedAppOptimizer.UNFREEZE_REASON_START_RECEIVER);

            if (queue.runningOomAdjusted) {
                queue.app.mState.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER);
+114 −44
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_COMPACTION;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FREEZER;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;

import android.annotation.IntDef;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ApplicationExitInfo;
@@ -54,6 +55,8 @@ import com.android.server.ServiceThread;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumMap;
@@ -94,6 +97,70 @@ public final class CachedAppOptimizer {
    @VisibleForTesting static final String KEY_FREEZER_EXEMPT_INST_PKG =
            "freeze_exempt_inst_pkg";


    static final int UNFREEZE_REASON_NONE =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_NONE;
    static final int UNFREEZE_REASON_ACTIVITY =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_ACTIVITY;
    static final int UNFREEZE_REASON_FINISH_RECEIVER =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FINISH_RECEIVER;
    static final int UNFREEZE_REASON_START_RECEIVER =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_START_RECEIVER;
    static final int UNFREEZE_REASON_BIND_SERVICE =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_BIND_SERVICE;
    static final int UNFREEZE_REASON_UNBIND_SERVICE =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_UNBIND_SERVICE;
    static final int UNFREEZE_REASON_START_SERVICE =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_START_SERVICE;
    static final int UNFREEZE_REASON_GET_PROVIDER =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_GET_PROVIDER;
    static final int UNFREEZE_REASON_REMOVE_PROVIDER =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_REMOVE_PROVIDER;
    static final int UNFREEZE_REASON_UI_VISIBILITY =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_UI_VISIBILITY;
    static final int UNFREEZE_REASON_ALLOWLIST =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_ALLOWLIST;
    static final int UNFREEZE_REASON_PROCESS_BEGIN =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_PROCESS_BEGIN;
    static final int UNFREEZE_REASON_PROCESS_END =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_PROCESS_END;
    static final int UNFREEZE_REASON_TRIM_MEMORY =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_TRIM_MEMORY;
    static final int UNFREEZE_REASON_PING =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_PING;
    static final int UNFREEZE_REASON_FILE_LOCKS =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FILE_LOCKS;
    static final int UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FILE_LOCK_CHECK_FAILURE;
    static final int UNFREEZE_REASON_BINDER_TXNS =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_BINDER_TXNS;
    static final int UNFREEZE_REASON_FEATURE_FLAGS =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FEATURE_FLAGS;

    @IntDef(prefix = {"UNFREEZE_REASON_"}, value = {
        UNFREEZE_REASON_NONE,
        UNFREEZE_REASON_ACTIVITY,
        UNFREEZE_REASON_FINISH_RECEIVER,
        UNFREEZE_REASON_START_RECEIVER,
        UNFREEZE_REASON_BIND_SERVICE,
        UNFREEZE_REASON_UNBIND_SERVICE,
        UNFREEZE_REASON_START_SERVICE,
        UNFREEZE_REASON_GET_PROVIDER,
        UNFREEZE_REASON_REMOVE_PROVIDER,
        UNFREEZE_REASON_UI_VISIBILITY,
        UNFREEZE_REASON_ALLOWLIST,
        UNFREEZE_REASON_PROCESS_BEGIN,
        UNFREEZE_REASON_PROCESS_END,
        UNFREEZE_REASON_TRIM_MEMORY,
        UNFREEZE_REASON_PING,
        UNFREEZE_REASON_FILE_LOCKS,
        UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE,
        UNFREEZE_REASON_BINDER_TXNS,
        UNFREEZE_REASON_FEATURE_FLAGS,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface UnfreezeReason {}

    // RSS Indices
    private static final int RSS_TOTAL_INDEX = 0;
    private static final int RSS_FILE_INDEX = 1;
@@ -888,7 +955,7 @@ public final class CachedAppOptimizer {
                    }

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

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

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

    @GuardedBy({"mAm", "mProcLock", "mFreezerLock"})
    void unfreezeAppInternalLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
    void unfreezeAppInternalLSP(ProcessRecord app, @UnfreezeReason int reason) {
        final int pid = app.getPid();
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        if (opt.isPendingFreeze()) {
@@ -1318,7 +1385,7 @@ public final class CachedAppOptimizer {
    }

    @GuardedBy({"mAm", "mProcLock"})
    void unfreezeAppLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
    void unfreezeAppLSP(ProcessRecord app, @UnfreezeReason int reason) {
        synchronized (mFreezerLock) {
            unfreezeAppInternalLSP(app, reason);
        }
@@ -1950,7 +2017,7 @@ public final class CachedAppOptimizer {
                                + name + "(" + pid + "): " + e);
                        synchronized (mAm) {
                            synchronized (mProcLock) {
                                unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
                                unfreezeAppLSP(proc, UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE);
                            }
                        }
                    }
@@ -1975,10 +2042,11 @@ public final class CachedAppOptimizer {
        }

        @GuardedBy({"mAm", "mProcLock"})
        private void rescheduleFreeze(final ProcessRecord proc, final String reason) {
        private void rescheduleFreeze(final ProcessRecord proc, final String reason,
                @UnfreezeReason int reasonCode) {
            Slog.d(TAG_AM, "Reschedule freeze for process " + proc.getPid()
                    + " " + proc.processName + " (" + reason + ")");
            unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
            unfreezeAppLSP(proc, reasonCode);
            freezeAppAsyncLSP(proc);
        }

@@ -2024,7 +2092,7 @@ public final class CachedAppOptimizer {
                // transactions that might be pending.
                try {
                    if (freezeBinder(pid, true, FREEZE_BINDER_TIMEOUT_MS) != 0) {
                        rescheduleFreeze(proc, "outstanding txns");
                        rescheduleFreeze(proc, "outstanding txns", UNFREEZE_REASON_BINDER_TXNS);
                        return;
                    }
                } catch (RuntimeException e) {
@@ -2076,7 +2144,8 @@ public final class CachedAppOptimizer {
                        pid,
                        name,
                        unfrozenDuration,
                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE);
                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE,
                        UNFREEZE_REASON_NONE);
            }

            try {
@@ -2085,7 +2154,7 @@ public final class CachedAppOptimizer {

                if ((freezeInfo & TXNS_PENDING_WHILE_FROZEN) != 0) {
                    synchronized (mProcLock) {
                        rescheduleFreeze(proc, "new pending txns");
                        rescheduleFreeze(proc, "new pending txns", UNFREEZE_REASON_BINDER_TXNS);
                    }
                    return;
                }
@@ -2102,7 +2171,7 @@ public final class CachedAppOptimizer {
        }

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

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

@@ -2114,38 +2183,8 @@ public final class CachedAppOptimizer {
                        pid,
                        processName,
                        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;
                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE, // deprecated
                        reason);
            }
        }

@@ -2171,7 +2210,7 @@ public final class CachedAppOptimizer {
                                Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks "
                                        + pr.processName + " (" + blocked + ")");
                                // Found at least one blocked non-cached process
                                unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE);
                                unfreezeAppLSP(app, UNFREEZE_REASON_FILE_LOCKS);
                                break;
                            }
                        }
@@ -2207,4 +2246,35 @@ public final class CachedAppOptimizer {
            mPidCompacting = -1;
        }
    }

    static int getUnfreezeReasonCodeFromOomAdjReason(@OomAdjuster.OomAdjReason int oomAdjReason) {
        switch (oomAdjReason) {
            case OomAdjuster.OOM_ADJ_REASON_ACTIVITY:
                return UNFREEZE_REASON_ACTIVITY;
            case OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER:
                return UNFREEZE_REASON_FINISH_RECEIVER;
            case OomAdjuster.OOM_ADJ_REASON_START_RECEIVER:
                return UNFREEZE_REASON_START_RECEIVER;
            case OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE:
                return UNFREEZE_REASON_BIND_SERVICE;
            case OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE:
                return UNFREEZE_REASON_UNBIND_SERVICE;
            case OomAdjuster.OOM_ADJ_REASON_START_SERVICE:
                return UNFREEZE_REASON_START_SERVICE;
            case OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER:
                return UNFREEZE_REASON_GET_PROVIDER;
            case OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER:
                return UNFREEZE_REASON_REMOVE_PROVIDER;
            case OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY:
                return UNFREEZE_REASON_UI_VISIBILITY;
            case OomAdjuster.OOM_ADJ_REASON_ALLOWLIST:
                return UNFREEZE_REASON_ALLOWLIST;
            case OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN:
                return UNFREEZE_REASON_PROCESS_BEGIN;
            case OomAdjuster.OOM_ADJ_REASON_PROCESS_END:
                return UNFREEZE_REASON_PROCESS_END;
            default:
                return UNFREEZE_REASON_NONE;
        }
    }
}
Loading