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

Commit c16955aa authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

BroadcastQueue: add more performance tracing.

To better understand what the modern stack is doing, add tracing
events for common operations.

Bug: 255936508
Test: ./frameworks/base/libs/hwui/tests/scripts/prep_generic.sh little && atest ActivityManagerPerfTests:BroadcastPerfTest
Change-Id: Iad3f83e85a79a1d134ffe74291ecc631f3fac66c
parent f0264d79
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -13874,6 +13874,29 @@ public class ActivityManagerService extends IActivityManager.Stub
            @Nullable IBinder backgroundActivityStartsToken,
            @Nullable int[] broadcastAllowList,
            @Nullable BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver) {
        final int cookie = BroadcastQueue.traceBegin("broadcastIntentLockedTraced");
        final int res = broadcastIntentLockedTraced(callerApp, callerPackage, callerFeatureId,
                intent, resolvedType, resultToApp, resultTo, resultCode, resultData, resultExtras,
                requiredPermissions, excludedPermissions, excludedPackages, appOp, bOptions,
                ordered, sticky, callingPid, callingUid, realCallingUid, realCallingPid, userId,
                allowBackgroundActivityStarts, backgroundActivityStartsToken, broadcastAllowList,
                filterExtrasForReceiver);
        BroadcastQueue.traceEnd(cookie);
        return res;
    }
    @GuardedBy("this")
    final int broadcastIntentLockedTraced(ProcessRecord callerApp, String callerPackage,
            @Nullable String callerFeatureId, Intent intent, String resolvedType,
            ProcessRecord resultToApp, IIntentReceiver resultTo, int resultCode, String resultData,
            Bundle resultExtras, String[] requiredPermissions,
            String[] excludedPermissions, String[] excludedPackages, int appOp, Bundle bOptions,
            boolean ordered, boolean sticky, int callingPid, int callingUid,
            int realCallingUid, int realCallingPid, int userId,
            boolean allowBackgroundActivityStarts,
            @Nullable IBinder backgroundActivityStartsToken,
            @Nullable int[] broadcastAllowList,
            @Nullable BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver) {
        // Ensure all internal loopers are registered for idle checks
        BroadcastLoopers.addMyLooper();
@@ -14425,6 +14448,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
        // Figure out who all will receive this broadcast.
        final int cookie = BroadcastQueue.traceBegin("queryReceivers");
        List receivers = null;
        List<BroadcastFilter> registeredReceivers = null;
        // Need to resolve the intent to interested receivers...
@@ -14455,6 +14479,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                        resolvedType, false /*defaultOnly*/, userId);
            }
        }
        BroadcastQueue.traceEnd(cookie);
        final boolean replacePending =
                (intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0;
+13 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.DropBoxManager;
import android.os.Handler;
import android.os.Trace;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;

@@ -76,6 +77,18 @@ public abstract class BroadcastQueue {
        }
    }

    static int traceBegin(@NonNull String methodName) {
        final int cookie = methodName.hashCode();
        Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                TAG, methodName, cookie);
        return cookie;
    }

    static void traceEnd(int cookie) {
        Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                TAG, cookie);
    }

    @Override
    public String toString() {
        return mQueueName;
+17 −17
Original line number Diff line number Diff line
@@ -64,7 +64,6 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.text.format.DateUtils;
import android.util.IndentingPrintWriter;
@@ -322,6 +321,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            return;
        }

        final int cookie = traceBegin("updateRunnableList");
        final boolean wantQueue = queue.isRunnable();
        final boolean inQueue = (queue == mRunnableHead) || (queue.runnableAtPrev != null)
                || (queue.runnableAtNext != null);
@@ -348,6 +348,8 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        if (queue.isEmpty() && !queue.isActive() && !queue.isProcessWarm()) {
            removeProcessQueue(queue.processName, queue.uid);
        }

        traceEnd(cookie);
    }

    /**
@@ -362,7 +364,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        int avail = mRunning.length - getRunningSize();
        if (avail == 0) return;

        final int cookie = traceBegin(TAG, "updateRunningList");
        final int cookie = traceBegin("updateRunningList");
        final long now = SystemClock.uptimeMillis();

        // If someone is waiting for a state, everything is runnable now
@@ -462,7 +464,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            });
        }

        traceEnd(TAG, cookie);
        traceEnd(cookie);
    }

    @Override
@@ -558,6 +560,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    public void enqueueBroadcastLocked(@NonNull BroadcastRecord r) {
        if (DEBUG_BROADCAST) logv("Enqueuing " + r + " for " + r.receivers.size() + " receivers");

        final int cookie = traceBegin("enqueueBroadcast");
        r.applySingletonPolicy(mService);

        final IntentFilter removeMatchingFilter = (r.options != null)
@@ -627,6 +630,8 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        if (r.receivers.isEmpty()) {
            scheduleResultTo(r);
        }

        traceEnd(cookie);
    }

    private void applyDeliveryGroupPolicy(@NonNull BroadcastRecord r) {
@@ -912,6 +917,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {

    private boolean finishReceiverLocked(@NonNull BroadcastProcessQueue queue,
            @DeliveryState int deliveryState, @NonNull String reason) {
        final int cookie = traceBegin("finishReceiver");
        checkState(queue.isActive(), "isActive");

        final ProcessRecord app = queue.app;
@@ -938,11 +944,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        final boolean shouldRetire =
                (queue.getActiveCountSinceIdle() >= mConstants.MAX_RUNNING_ACTIVE_BROADCASTS);

        final boolean res;
        if (queue.isRunnable() && queue.isProcessWarm() && !shouldRetire) {
            // We're on a roll; move onto the next broadcast for this process
            queue.makeActiveNextPending();
            scheduleReceiverWarmLocked(queue);
            return true;
            res = true;
        } else {
            // We've drained running broadcasts; maybe move back to runnable
            queue.makeActiveIdle();
@@ -956,8 +963,10 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            // Tell other OS components that app is not actively running, giving
            // a chance to update OOM adjustment
            notifyStoppedRunning(queue);
            return false;
            res = false;
        }
        traceEnd(cookie);
        return res;
    }

    /**
@@ -967,6 +976,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    private void setDeliveryState(@Nullable BroadcastProcessQueue queue,
            @Nullable ProcessRecord app, @NonNull BroadcastRecord r, int index,
            @NonNull Object receiver, @DeliveryState int newDeliveryState, String reason) {
        final int cookie = traceBegin("setDeliveryState");
        final int oldDeliveryState = getDeliveryState(r, index);

        // Only apply state when we haven't already reached a terminal state;
@@ -1024,6 +1034,8 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
                enqueueUpdateRunningList();
            }
        }

        traceEnd(cookie);
    }

    private @DeliveryState int getDeliveryState(@NonNull BroadcastRecord r, int index) {
@@ -1286,18 +1298,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        }
    }

    private int traceBegin(String trackName, String methodName) {
        final int cookie = methodName.hashCode();
        Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                trackName, methodName, cookie);
        return cookie;
    }

    private void traceEnd(String trackName, int cookie) {
        Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                trackName, cookie);
    }

    private void updateWarmProcess(@NonNull BroadcastProcessQueue queue) {
        if (!queue.isProcessWarm()) {
            queue.setProcess(mService.getProcessRecordLocked(queue.processName, queue.uid));