From 74889310a3203390093db0c6ef2268f5946f6b01 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 23 Dec 2021 18:05:32 -0600 Subject: [PATCH] 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 --- .../android/server/wm/BLASTSyncEngine.java | 19 +++++++++++++++---- .../com/android/server/wm/Transition.java | 13 ++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/BLASTSyncEngine.java b/services/core/java/com/android/server/wm/BLASTSyncEngine.java index 2a8ac39ead8dd..3ce6b51900bfe 100644 --- a/services/core/java/com/android/server/wm/BLASTSyncEngine.java +++ b/services/core/java/com/android/server/wm/BLASTSyncEngine.java @@ -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 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); diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index c6948eee5a0c3..1b71f2dad9702 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -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.