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

Commit 74889310 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Add some traces for shell transition

This includes 3 traces:
1. Create sync group ~ finish
   The duration from transition creation to participants are ready.
2. onTransactionReady
   The duration of preparing TransitionInfo, start/finishTransaction.
3. Tell shell onTransitionReady ~ finishTransition
   The duration of transition animation.

Bug: 211846272
Test: adb shell setprop persist.debug.shell_transit 1; reboot
      Launch an app with "record_android_trace wm".

Change-Id: I0c7cdb98d5c3250c50caf25e147bfe21c1366514
parent f774fb2f
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -16,9 +16,12 @@

package com.android.server.wm;

import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;

import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SYNC_ENGINE;

import android.annotation.NonNull;
import android.os.Trace;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
@@ -56,6 +59,7 @@ import com.android.internal.protolog.common.ProtoLog;
 */
class BLASTSyncEngine {
    private static final String TAG = "BLASTSyncEngine";
    private static final String TRACE_NAME_SYNC_GROUP_READY = "SyncGroupReady";

    interface TransactionReadyListener {
        void onTransactionReady(int mSyncId, SurfaceControl.Transaction transaction);
@@ -72,7 +76,7 @@ class BLASTSyncEngine {
        final ArraySet<WindowContainer> mRootMembers = new ArraySet<>();
        private SurfaceControl.Transaction mOrphanTransaction = null;

        private SyncGroup(TransactionReadyListener listener, int id) {
        private SyncGroup(TransactionReadyListener listener, int id, String name) {
            mSyncId = id;
            mListener = listener;
            mOnTimeout = () -> {
@@ -81,6 +85,10 @@ class BLASTSyncEngine {
                    onTimeout();
                }
            };
            if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER,
                        name + TRACE_NAME_SYNC_GROUP_READY, id);
            }
        }

        /**
@@ -113,6 +121,7 @@ class BLASTSyncEngine {
        }

        private void finishNow() {
            Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, TRACE_NAME_SYNC_GROUP_READY, mSyncId);
            ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Finished!", mSyncId);
            SurfaceControl.Transaction merged = mWm.mTransactionFactory.get();
            if (mOrphanTransaction != null) {
@@ -121,7 +130,9 @@ class BLASTSyncEngine {
            for (WindowContainer wc : mRootMembers) {
                wc.finishSync(merged, false /* cancel */);
            }
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "onTransactionReady");
            mListener.onTransactionReady(mSyncId, merged);
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
            mActiveSyncs.remove(mSyncId);
            mWm.mH.removeCallbacks(mOnTimeout);
        }
@@ -168,12 +179,12 @@ class BLASTSyncEngine {
    }

    int startSyncSet(TransactionReadyListener listener) {
        return startSyncSet(listener, WindowState.BLAST_TIMEOUT_DURATION);
        return startSyncSet(listener, WindowState.BLAST_TIMEOUT_DURATION, "");
    }

    int startSyncSet(TransactionReadyListener listener, long timeoutMs) {
    int startSyncSet(TransactionReadyListener listener, long timeoutMs, String name) {
        final int id = mNextSyncId++;
        final SyncGroup s = new SyncGroup(listener, id);
        final SyncGroup s = new SyncGroup(listener, id, name);
        mActiveSyncs.put(id, s);
        ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Started for listener: %s", id, listener);
        scheduleTimeout(s, timeoutMs);
+12 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.INPUT_CONSUMER_RECENTS_ANIMATION;
@@ -66,6 +67,7 @@ import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
@@ -89,6 +91,7 @@ import java.util.ArrayList;
 */
class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListener {
    private static final String TAG = "Transition";
    private static final String TRACE_NAME_PLAY_TRANSITION = "PlayTransition";

    /** The transition has been created and is collecting, but hasn't formally started. */
    private static final int STATE_COLLECTING = 0;
@@ -174,7 +177,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
        mFlags = flags;
        mController = controller;
        mSyncEngine = syncEngine;
        mSyncId = mSyncEngine.startSyncSet(this, timeoutMs);
        mSyncId = mSyncEngine.startSyncSet(this, timeoutMs, TAG);
    }

    void addFlag(int flag) {
@@ -395,6 +398,10 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
     * be called directly; use {@link TransitionController#finishTransition} instead.
     */
    void finishTransition() {
        if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
            Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, TRACE_NAME_PLAY_TRANSITION,
                    System.identityHashCode(this));
        }
        mStartTransaction = mFinishTransaction = null;
        if (mState < STATE_PLAYING) {
            throw new IllegalStateException("Can't finish a non-playing transition " + mSyncId);
@@ -630,6 +637,10 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
                        "Calling onTransitionReady: %s", info);
                mController.getTransitionPlayer().onTransitionReady(
                        this, info, transaction, mFinishTransaction);
                if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                    Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, TRACE_NAME_PLAY_TRANSITION,
                            System.identityHashCode(this));
                }
            } catch (RemoteException e) {
                // If there's an exception when trying to send the mergedTransaction to the
                // client, we should finish and apply it here so the transactions aren't lost.