summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Gustav Sennton <gsennton@google.com> 2024-09-12 09:46:12 +0000
committer Gustav Sennton <gsennton@google.com> 2024-10-23 08:19:56 +0000
commit2f8edea084d89df50d844c6e23f68ffadc3d56a5 (patch)
treeb248c9604270fd35b334795825138c91f32df5f4
parent4209c716b445e134a4d538e85581182d8308879a (diff)
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
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java68
1 files changed, 61 insertions, 7 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 346f21b86e65..7c9cd0862b69 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -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();