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 873e18d0e5cfa..1c40044658868 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; @@ -67,6 +68,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; @@ -93,6 +95,7 @@ import java.util.function.Predicate; */ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListener { private static final String TAG = "Transition"; + private static final String TRACE_NAME_PLAY_TRANSITION = "PlayTransition"; /** The default package for resources */ private static final String DEFAULT_PACKAGE = "android"; @@ -181,7 +184,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) { @@ -402,6 +405,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); @@ -639,6 +646,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.