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

Commit 150a6bac authored by Ng Zhi An's avatar Ng Zhi An
Browse files

Add new queue to offload slow broadcasts

Process BOOT_COMPLETED on this new queue

Change-Id: I14e7e7cc42f02b38a9becb47f7913684f55979fa
Test: boot device, dumpsys activity broadcasts
Bug: 111368744
parent cded3f16
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -5269,6 +5269,7 @@ public class Intent implements Parcelable, Cloneable {
            FLAG_RECEIVER_EXCLUDE_BACKGROUND,
            FLAG_RECEIVER_EXCLUDE_BACKGROUND,
            FLAG_RECEIVER_FROM_SHELL,
            FLAG_RECEIVER_FROM_SHELL,
            FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS,
            FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS,
            FLAG_RECEIVER_OFFLOAD,
    })
    })
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Flags {}
    public @interface Flags {}
@@ -5313,6 +5314,7 @@ public class Intent implements Parcelable, Cloneable {
            FLAG_RECEIVER_EXCLUDE_BACKGROUND,
            FLAG_RECEIVER_EXCLUDE_BACKGROUND,
            FLAG_RECEIVER_FROM_SHELL,
            FLAG_RECEIVER_FROM_SHELL,
            FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS,
            FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS,
            FLAG_RECEIVER_OFFLOAD,
    })
    })
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface MutableFlags {}
    public @interface MutableFlags {}
@@ -5738,6 +5740,12 @@ public class Intent implements Parcelable, Cloneable {
     * background priority class.
     * background priority class.
     */
     */
    public static final int FLAG_RECEIVER_FOREGROUND = 0x10000000;
    public static final int FLAG_RECEIVER_FOREGROUND = 0x10000000;
    /**
     * If set, when sending a broadcast the recipient will be run on the offload queue.
     *
     * @hide
     */
    public static final int FLAG_RECEIVER_OFFLOAD = 0x80000000;
    /**
    /**
     * If this is an ordered broadcast, don't allow receivers to abort the broadcast.
     * If this is an ordered broadcast, don't allow receivers to abort the broadcast.
     * They can still propagate results through to later receivers, but they can not prevent
     * They can still propagate results through to later receivers, but they can not prevent
+27 −4
Original line number Original line Diff line number Diff line
@@ -539,14 +539,23 @@ public class ActivityManagerService extends IActivityManager.Stub
    BroadcastQueue mFgBroadcastQueue;
    BroadcastQueue mFgBroadcastQueue;
    BroadcastQueue mBgBroadcastQueue;
    BroadcastQueue mBgBroadcastQueue;
    BroadcastQueue mOffloadBroadcastQueue;
    // Convenient for easy iteration over the queues. Foreground is first
    // Convenient for easy iteration over the queues. Foreground is first
    // so that dispatch of foreground broadcasts gets precedence.
    // so that dispatch of foreground broadcasts gets precedence.
    final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2];
    final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[3];
    BroadcastStats mLastBroadcastStats;
    BroadcastStats mLastBroadcastStats;
    BroadcastStats mCurBroadcastStats;
    BroadcastStats mCurBroadcastStats;
    BroadcastQueue broadcastQueueForIntent(Intent intent) {
    BroadcastQueue broadcastQueueForIntent(Intent intent) {
        if (isOnOffloadQueue(intent.getFlags())) {
            if (DEBUG_BROADCAST_BACKGROUND) {
                Slog.i(TAG_BROADCAST,
                        "Broadcast intent " + intent + " on offload queue");
            }
            return mOffloadBroadcastQueue;
        }
        final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
        final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
        if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST,
        if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST,
                "Broadcast intent " + intent + " on "
                "Broadcast intent " + intent + " on "
@@ -2176,8 +2185,11 @@ public class ActivityManagerService extends IActivityManager.Stub
                "foreground", BROADCAST_FG_TIMEOUT, false);
                "foreground", BROADCAST_FG_TIMEOUT, false);
        mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
        mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "background", BROADCAST_BG_TIMEOUT, true);
                "background", BROADCAST_BG_TIMEOUT, true);
        mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
                "offload", BROADCAST_BG_TIMEOUT, true);
        mBroadcastQueues[0] = mFgBroadcastQueue;
        mBroadcastQueues[0] = mFgBroadcastQueue;
        mBroadcastQueues[1] = mBgBroadcastQueue;
        mBroadcastQueues[1] = mBgBroadcastQueue;
        mBroadcastQueues[2] = mOffloadBroadcastQueue;
        mServices = new ActiveServices(this);
        mServices = new ActiveServices(this);
        mProviderMap = new ProviderMap(this);
        mProviderMap = new ProviderMap(this);
@@ -13358,7 +13370,8 @@ public class ActivityManagerService extends IActivityManager.Stub
    boolean isPendingBroadcastProcessLocked(int pid) {
    boolean isPendingBroadcastProcessLocked(int pid) {
        return mFgBroadcastQueue.isPendingBroadcastProcessLocked(pid)
        return mFgBroadcastQueue.isPendingBroadcastProcessLocked(pid)
                || mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid);
                || mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid)
                || mOffloadBroadcastQueue.isPendingBroadcastProcessLocked(pid);
    }
    }
    void skipPendingBroadcastLocked(int pid) {
    void skipPendingBroadcastLocked(int pid) {
@@ -14604,10 +14617,16 @@ public class ActivityManagerService extends IActivityManager.Stub
        try {
        try {
            boolean doNext = false;
            boolean doNext = false;
            BroadcastRecord r;
            BroadcastRecord r;
            BroadcastQueue queue;
            synchronized(this) {
            synchronized(this) {
                BroadcastQueue queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0
                if (isOnOffloadQueue(flags)) {
                    queue = mOffloadBroadcastQueue;
                } else {
                    queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0
                            ? mFgBroadcastQueue : mBgBroadcastQueue;
                            ? mFgBroadcastQueue : mBgBroadcastQueue;
                }
                r = queue.getMatchingOrderedReceiver(who);
                r = queue.getMatchingOrderedReceiver(who);
                if (r != null) {
                if (r != null) {
                    doNext = r.queue.finishReceiverLocked(r, resultCode,
                    doNext = r.queue.finishReceiverLocked(r, resultCode,
@@ -19474,4 +19493,8 @@ public class ActivityManagerService extends IActivityManager.Stub
            }
            }
        }
        }
    }
    }
    private boolean isOnOffloadQueue(int flags) {
        return ((flags & Intent.FLAG_RECEIVER_OFFLOAD) != 0);
    }
}
}
+7 −5
Original line number Original line Diff line number Diff line
@@ -22,14 +22,15 @@ import static android.app.ActivityManager.USER_OP_ERROR_IS_SYSTEM;
import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
import static android.app.ActivityManager.USER_OP_IS_CURRENT;
import static android.app.ActivityManager.USER_OP_IS_CURRENT;
import static android.app.ActivityManager.USER_OP_SUCCESS;
import static android.app.ActivityManager.USER_OP_SUCCESS;
import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.SYSTEM_UID;

import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
import static com.android.server.am.ActivityManagerService.MY_PID;
import static com.android.server.am.ActivityManagerService.MY_PID;
import static com.android.server.am.UserState.STATE_BOOTING;
import static com.android.server.am.UserState.STATE_BOOTING;
import static com.android.server.am.UserState.STATE_RUNNING_LOCKED;
import static com.android.server.am.UserState.STATE_RUNNING_LOCKED;
@@ -40,7 +41,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManager;
import com.android.server.wm.ActivityTaskManagerInternal;
import android.app.AppGlobals;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.AppOpsManager;
import android.app.Dialog;
import android.app.Dialog;
@@ -99,6 +99,7 @@ import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.LocalServices;
import com.android.server.SystemServiceManager;
import com.android.server.SystemServiceManager;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.UserManagerService;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerService;
import com.android.server.wm.WindowManagerService;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -549,7 +550,8 @@ class UserController implements Handler.Callback {
        final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
        final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
        bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
        bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
        bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
        bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
                | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
                | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
                | Intent.FLAG_RECEIVER_OFFLOAD);
        mInjector.broadcastIntent(bootIntent, null, new IIntentReceiver.Stub() {
        mInjector.broadcastIntent(bootIntent, null, new IIntentReceiver.Stub() {
                    @Override
                    @Override
                    public void performReceive(Intent intent, int resultCode, String data,
                    public void performReceive(Intent intent, int resultCode, String data,