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

Commit 2f8edea0 authored by Gustav Sennton's avatar Gustav Sennton
Browse files

Add perf traces for Transitions calls to handlers and observers.

Add Traces for common Transitions calls to be able to debug performance
issues quicker.

Test: Perfetto traces
Bug: 366191871
Flag: EXEMPT tracing only update
Change-Id: Ie2a72114d02d0d4299f1ab18ebfd73045aeac61a
parent 4209c716
Loading
Loading
Loading
Loading
+61 −7
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.wm.shell.transition;

import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM;
@@ -58,6 +59,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.Trace;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.Log;
@@ -800,8 +802,17 @@ public class Transitions implements RemoteCallable<Transitions>,
        track.mReadyTransitions.add(active);

        for (int i = 0; i < mObservers.size(); ++i) {
            final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER);
            if (useTrace) {
                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
                        mObservers.get(i).getClass().getSimpleName() + "#onTransitionReady: "
                                + transitTypeToString(info.getType()));
            }
            mObservers.get(i).onTransitionReady(
                    active.mToken, info, active.mStartT, active.mFinishT);
            if (useTrace) {
                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
            }
        }

        /*
@@ -931,7 +942,7 @@ public class Transitions implements RemoteCallable<Transitions>,
                onFinish(ready.mToken, null);
                return;
            }
            playTransition(ready);
            playTransitionWithTracing(ready);
            // Attempt to merge any more queued-up transitions.
            processReadyQueue(track);
            return;
@@ -1003,6 +1014,18 @@ public class Transitions implements RemoteCallable<Transitions>,
        processReadyQueue(track);
    }

    private void playTransitionWithTracing(@NonNull ActiveTransition active) {
        final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER);
        if (useTrace) {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
                    "playTransition: " + transitTypeToString(active.mInfo.getType()));
        }
        playTransition(active);
        if (useTrace) {
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }
    }

    private void playTransition(@NonNull ActiveTransition active) {
        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Playing animation for %s", active);
        final var token = active.mToken;
@@ -1022,6 +1045,12 @@ public class Transitions implements RemoteCallable<Transitions>,
            if (consumed) {
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by firstHandler");
                mTransitionTracer.logDispatched(active.mInfo.getDebugId(), active.mHandler);
                if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                    Trace.instant(TRACE_TAG_WINDOW_MANAGER,
                            active.mHandler.getClass().getSimpleName()
                                    + "#startAnimation animated "
                                    + transitTypeToString(active.mInfo.getType()));
                }
                return;
            }
        }
@@ -1052,6 +1081,12 @@ public class Transitions implements RemoteCallable<Transitions>,
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by %s",
                        mHandlers.get(i));
                mTransitionTracer.logDispatched(info.getDebugId(), mHandlers.get(i));
                if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                    Trace.instant(TRACE_TAG_WINDOW_MANAGER,
                            mHandlers.get(i).getClass().getSimpleName()
                                    + "#startAnimation animated "
                                    + transitTypeToString(info.getType()));
                }
                return mHandlers.get(i);
            }
        }
@@ -1059,6 +1094,26 @@ public class Transitions implements RemoteCallable<Transitions>,
                "This shouldn't happen, maybe the default handler is broken.");
    }

    private Pair<TransitionHandler, WindowContainerTransaction> dispatchRequestWithTracing(
            @NonNull IBinder transition, @NonNull TransitionRequestInfo request,
            @Nullable TransitionHandler skip) {
        final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER);
        if (useTrace) {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
                    "dispatchRequest: " + transitTypeToString(request.getType()));
        }
        Pair<TransitionHandler, WindowContainerTransaction> result =
                dispatchRequest(transition, request, skip);
        if (useTrace) {
            if (result != null) {
                Trace.instant(TRACE_TAG_WINDOW_MANAGER, result.first.getClass().getSimpleName()
                        + "#handleRequest handled " + transitTypeToString(request.getType()));
            }
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }
        return result;
    }

    /**
     * Gives every handler (in order) a chance to handle request until one consumes the transition.
     * @return the WindowContainerTransaction given by the handler which consumed the transition.
@@ -1197,12 +1252,11 @@ public class Transitions implements RemoteCallable<Transitions>,
            mSleepHandler.handleRequest(transitionToken, request);
            active.mHandler = mSleepHandler;
        } else {
            for (int i = mHandlers.size() - 1; i >= 0; --i) {
                wct = mHandlers.get(i).handleRequest(transitionToken, request);
                if (wct != null) {
                    active.mHandler = mHandlers.get(i);
                    break;
                }
            Pair<TransitionHandler, WindowContainerTransaction> requestResult =
                    dispatchRequestWithTracing(transitionToken, request, /* skip= */ null);
            if (requestResult != null) {
                active.mHandler = requestResult.first;
                wct = requestResult.second;
            }
            if (request.getDisplayChange() != null) {
                TransitionRequestInfo.DisplayChange change = request.getDisplayChange();