Add support for tracing Window Manager events in UiTraceListener.
This change introduces a new option, `TRACE_WM_KEY`, to enable the `android.windowmanager` data source in Perfetto traces. When enabled, verbose Window Manager logs are collected at a frame frequency.
Bug: 438461160
Change-Id: I344411ef4521f500df7b146d07d3437216c9aa14
diff --git a/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java b/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java
index 8e4d8c1..f23edd9 100644
--- a/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java
+++ b/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java
@@ -44,6 +44,7 @@
public static final String TRACE_LAYERS_KEY = "trace_layers";
public static final String TRACE_SHELL_TRANSITIONS_KEY = "trace_shell_transitions";
public static final String TRACE_INPUT_KEY = "trace_input";
+ public static final String TRACE_WM_KEY = "trace_windows";
public static final String PROTOLOG_GROUPS_KEY = "protolog_groups";
public UiTraceListener() {
@@ -171,6 +172,22 @@
.setAndroidInputEventConfig(inputConfig)));
}
+ // Window Manager
+ if (traceWindows(args)) {
+ Log.d(LOG_TAG, "Enabling window manager datasource");
+ var wmConfig =
+ PerfettoConfig.WindowManagerConfig.newBuilder()
+ .setLogLevel(PerfettoConfig.WindowManagerConfig.LogLevel.LOG_LEVEL_VERBOSE)
+ .setLogFrequency(
+ PerfettoConfig.WindowManagerConfig.LogFrequency.LOG_FREQUENCY_FRAME);
+ config.addDataSources(
+ PerfettoConfig.TraceConfig.DataSource.newBuilder()
+ .setConfig(
+ PerfettoConfig.DataSourceConfig.newBuilder()
+ .setName("android.windowmanager")
+ .setWindowmanagerConfig(wmConfig)));
+ }
+
// Protolog
String protologGroups = args.getString(PROTOLOG_GROUPS_KEY);
if (protologGroups != null && !protologGroups.isEmpty()) {
@@ -214,4 +231,8 @@
protected boolean traceInput(Bundle args) {
return Boolean.parseBoolean(args.getString(TRACE_INPUT_KEY, "false"));
}
+
+ protected boolean traceWindows(Bundle args) {
+ return Boolean.parseBoolean(args.getString(TRACE_WM_KEY, "false"));
+ }
}
diff --git a/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java b/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java
index 5d63f07..ce34ad1 100644
--- a/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java
+++ b/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java
@@ -60,6 +60,7 @@
b.putString(UiTraceListener.TRACE_LAYERS_KEY, "false");
b.putString(UiTraceListener.TRACE_SHELL_TRANSITIONS_KEY, "false");
b.putString(UiTraceListener.TRACE_INPUT_KEY, "false");
+ b.putString(UiTraceListener.TRACE_WM_KEY, "false");
b.putString(UiTraceListener.PROTOLOG_GROUPS_KEY, "");
UiTraceListener listener = new UiTraceListener(b, List.of());
@@ -81,6 +82,7 @@
b.putString(UiTraceListener.TRACE_LAYERS_KEY, "true");
b.putString(UiTraceListener.TRACE_SHELL_TRANSITIONS_KEY, "true");
b.putString(UiTraceListener.TRACE_INPUT_KEY, "true");
+ b.putString(UiTraceListener.TRACE_WM_KEY, "true");
b.putString(UiTraceListener.PROTOLOG_GROUPS_KEY, "WM_DEBUG_FOCUS,WM_DEBUG_ADD_REMOVE");
UiTraceListener listener = new UiTraceListener(b, List.of());
@@ -98,6 +100,7 @@
assertTrue(sourceNames.contains("com.android.wm.shell.transition"));
assertTrue(sourceNames.contains("android.input.inputevent"));
assertTrue(sourceNames.contains("android.protolog"));
+ assertTrue(sourceNames.contains("android.windowmanager"));
PerfettoConfig.TraceConfig.DataSource protologSource =
config.getDataSourcesList().stream()
@@ -119,6 +122,7 @@
b.putString(UiTraceListener.TRACE_LAYERS_KEY, "true");
b.putString(UiTraceListener.TRACE_SHELL_TRANSITIONS_KEY, "true");
b.putString(UiTraceListener.TRACE_INPUT_KEY, "true");
+ b.putString(UiTraceListener.TRACE_WM_KEY, "true");
b.putString(UiTraceListener.PROTOLOG_GROUPS_KEY, "WM_DEBUG_FOCUS,WM_DEBUG_ADD_REMOVE");
var listener = new UiTraceListener(b, List.of());