Los seguimientos de Winscope se pueden recopilar con la línea de comandos adb
en compilaciones de depuración (es decir, compilaciones userdebug
y eng
). Antes de recopilar registros de Winscope con adb
, ejecuta adb root
.
A partir de Android 15, los seguimientos de Winscope se integran en Perfetto y se recopilan con la línea de comandos de Perfetto. Cada registro de Winscope es una fuente de datos de Perfetto con su propia configuración. Puedes habilitar las configuraciones de forma individual o en una sola sesión de seguimiento.
En Android 14 y versiones anteriores, cada registro de Winscope tiene un comando diferente y puedes recoger cada uno de forma independiente. Consulta Cómo capturar registros en Android 14 y versiones anteriores para obtener más información.
WindowManager
Usa el nombre de la fuente de datos android.windowmanager
para este tipo de registro.
Opciones de configuración
Nivel de registro (
log_level
): Especifica la verbosidad del registro. Valores admitidos:LOG_LEVEL_VERBOSE
: Registra todos los elementos con la cantidad máxima de información.LOG_LEVEL_DEBUG
: Registra todos los elementos, pero no escribe todos los datos de configuración.LOG_LEVEL_CRITICAL
: Solo registra los elementos visibles, con la cantidad mínima de sobrecarga de rendimiento.
Frecuencia de registro (
log_frequency
): Define la frecuencia con la que se registran los elementos:LOG_FREQUENCY_FRAME
: Genera un seguimiento de las instantáneas de estado cuando se confirma un fotograma.LOG_FREQUENCY_TRANSACTION
: Genera un registro de las instantáneas de estado cada vez que se confirma una transacción.LOG_FREQUENCY_SINGLE_DUMP
: Genera un seguimiento de instantáneas de estado único cuando se inicia la fuente de datos.
Consulta WindowManager para obtener detalles sobre los valores de configuración.
Ejemplo
El siguiente es un ejemplo del tipo de seguimiento de WindowManager para adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
EOF
ProtoLog
Usa el nombre de la fuente de datos android.protolog
para este tipo de registro.
Opciones de configuración
Modo de seguimiento (tracing_mode
): Determina la configuración de registro que se usará:
DEFAULT
: Genera registros solo de los grupos y niveles de registro especificados engroup_overrides
.ENABLE_ALL
: Genera un seguimiento de todos los grupos y niveles de registro, a menos que se especifique engroup_overrides
.
Nivel de registro mínimo (default_log_from_level
): Si se establece, se realiza un seguimiento de cualquier mensaje con un nivel de registro superior a este nivel, a menos que se especifique una anulación de grupo. Por ejemplo, se usa para habilitar el registro de todas las advertencias y errores, sin tener que habilitar todos los registros. Los valores admitidos son los siguientes:
PROTOLOG_LEVEL_DEBUG
PROTOLOG_LEVEL_VERBOSE
PROTOLOG_LEVEL_INFO
PROTOLOG_LEVEL_WARN
PROTOLOG_LEVEL_ERROR
PROTOLOG_LEVEL_WTF
Anulaciones de grupo (group_overrides
): Habilita la configuración manual del nivel de registro para cada grupo de ProtoLog. Cada grupo contiene lo siguiente:
name
: Es el nombre del grupo de ProtoLog, que se usa en el código fuente de Android.log_from
: Igual quedefault_log_from_level
, pero se especifica solo para el grupo actual.collect_stacktrace
: Cuando se establece entrue
, recopila el seguimiento de pila de cada mensaje de ProtoLog en el grupo del que se realiza el seguimiento.
Ejemplo
El siguiente es un ejemplo del tipo de seguimiento de ProtoLog para adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: DEFAULT
default_log_from_level: PROTOLOG_LEVEL_WARN
group_overrides: {
group_name: "WM_SHELL_STARTING_WINDOW"
log_from: PROTOLOG_LEVEL_DEBUG
collect_stacktrace: true
}
}
}
}
EOF
Entrada
Usa el nombre de la fuente de datos android.input.inputevent
para este tipo de registro.
Opciones de configuración
Modo de seguimiento (trace_mode
): Determina si se debe iniciar el seguimiento de entrada con reglas que preservan la privacidad o si se deben registrar todos los eventos de entrada:
TRACE_MODE_TRACE_ALL
: Registra todos los eventos de entrada que procesa el sistema, independientemente del contexto en el que se procesaron.TRACE_MODE_USE_RULES
: Usa las reglas de seguimiento definidas en esta configuración para especificar qué eventos se deben seguir. Consultaandroid_input_event_config.proto
para obtener más información sobre cómo especificar las reglas del seguimiento.
Ejemplo
El siguiente es un ejemplo del tipo de seguimiento de entrada para adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
EOF
SurfaceFlinger (capas)
Usa el nombre de la fuente de datos android.surfaceflinger.layers
para este tipo de registro.
Opciones de configuración
Modo de registro (mode
): Define la frecuencia con la que se registran los elementos:
MODE_ACTIVE
: Rastrea las instantáneas de capas. Se toma una instantánea cada vez que se produce un cambio en las capas.MODE_GENERATED
: Genera instantáneas de capas a partir de las transacciones que se guardan en el búfer circular interno de SurfaceFlinger. La generación de instantáneas de la capa se produce cuando se borra esta fuente de datos.MODE_DUMP
: Traza una instantánea de una sola capa.MODE_GENERATED_BUGREPORT_ONLY
: Es igual queMODE_GENERATED
, pero activa la generación de instantáneas de capas solo cuando se toma un informe de errores, no cada vez que se borra un registro.
Marcas de seguimiento (trace_flags
):
TRACE_FLAG_INPUT
: Si la superficie contiene datos de entrada, realiza un seguimiento de las especificaciones de la ventana de entrada.TRACE_FLAG_COMPOSITION
: Rastrea el tipo de composición y la región visible.TRACE_FLAG_EXTRA
: Rastrea metadatos de superficie adicionales, incluidas las capas fuera de la pantalla.TRACE_FLAG_HWC
: Genera un registro de metadatos adicionales del compositor de hardware no estructurado.TRACE_FLAG_BUFFERS
: Configura SurfaceFlinger para que rastree todos los cambios de búfer en la superficie. De forma predeterminada, SurfaceFlinger rastrea un estado nuevo solo cuando se producen alteraciones de geometría.TRACE_FLAG_VIRTUAL_DISPLAYS
: Incluye capas de visualización virtuales en el seguimiento.
Ejemplo
El siguiente es un ejemplo del tipo de seguimiento de SurfaceFlinger para adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
EOF
Consulta SurfaceFlinger para obtener detalles sobre el significado de los diferentes valores de configuración.
Transiciones de Shell
Usa el nombre de la fuente de datos com.android.wm.shell.transition
para este tipo de registro.
Opciones de configuración
Este tipo de registro no tiene opciones de configuración.
Ejemplo
El siguiente es un ejemplo del tipo de seguimiento de transición de shell para adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
EOF
SurfaceFlinger (transacciones)
Usa el nombre de la fuente de datos android.surfaceflinger.transactions
para este tipo de seguimiento.
Opciones de configuración
Modo de registro (mode
): Define la frecuencia con la que se registran los elementos:
MODE_CONTINUOUS
: SurfaceFlinger escribe su búfer circular interno de transacciones cada vez que se borra la fuente de datos. El búfer circular contiene el estado inicial de SurfaceFlinger y las transacciones más recientes.MODE_ACTIVE
: SurfaceFlinger escribe el estado inicial y, luego, cada transacción entrante hasta que se detiene la fuente de datos.
Ejemplo
El siguiente es un ejemplo del tipo de registro de transacciones de SurfaceFlinger para adb.
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
EOF
IME
Usa el nombre de la fuente de datos: android.inputmethod
para este tipo de registro.
Opciones de configuración
Este tipo de registro no tiene opciones de configuración.
Ejemplo
El siguiente es un ejemplo del tipo de seguimiento del IME para adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.inputmethod"
}
}
EOF
ViewCapture
Usa el nombre de la fuente de datos android.viewcapture
para este tipo de registro.
Opciones de configuración
Este tipo de registro no tiene opciones de configuración.
Ejemplo
El siguiente es un ejemplo del tipo de seguimiento de ViewCapture para adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
Ejemplo completo
Perfetto te permite recopilar datos de varias fuentes en una sola configuración. Puedes recopilar todos los seguimientos de Winscope con un solo comando:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: ENABLE_ALL
}
}
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
data_sources: {
config {
name: "android.inputmethod"
}
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
Cómo capturar seguimientos en Android 14 y versiones anteriores
Ejecuta adb root
antes de ejecutar los comandos adb shell
para cada uno de los siguientes seguimientos. Al final del registro, los archivos de registro están disponibles en /data/misc/wmtrace
. Para copiar un archivo o directorio y sus subdirectorios desde un dispositivo, consulta Cómo copiar archivos desde y hacia un dispositivo.
Seguimientos de WindowManager
Para capturar seguimientos de WindowManager, haz lo siguiente:
Habilita el seguimiento:
adb shell wm tracing start
Inhabilita el seguimiento:
adb shell wm tracing stop
Guarda los datos de registro en un archivo mientras ejecutas una captura de registro:
adb shell wm tracing save-for-bugreport
Registra el seguimiento una vez por fotograma:
adb shell wm tracing frame
Registra cada transacción:
adb shell wm tracing transaction
Establece el tamaño máximo del registro (en KB):
adb shell wm tracing size
Imprimir el estado del seguimiento:
adb shell wm tracing status
Establece el nivel de registro en
critical
(solo ventanas visibles con información reducida),trim
(todas las ventanas con información reducida) oall
(todas las ventanas y la información):adb shell wm tracing level
Volcados de WindowManager
Para capturar volcados de WindowManager, haz lo siguiente:
adb exec-out dumpsys window --proto > window_dump.winscope
ProtoLog
Los siguientes comandos se usan para el sistema ProtoLog.
En el proceso system_server
, sucede lo siguiente:
Inicia ProtoLog:
adb shell cmd window logging start
Detener ProtoLog:
adb shell cmd window logging stop
Habilita ProtoLog para grupos de registros determinados:
adb shell cmd window logging enable [group...]
Inhabilita ProtoLog para grupos de registros determinados:
adb shell cmd window logging disable [group...]
Habilita el registro de Logcat para grupos de registros determinados:
adb shell cmd window logging enable-text [group...]
Inhabilita el registro de Logcat para grupos de registros determinados:
adb shell cmd window logging disable-text [group...]
En WMShell:
Inicia ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
Seguimientos (capas) de SurfaceFlinger
El registro de capas de SurfaceFlinger usa el registro de Perfetto para la captura. Consulta Configuración de seguimiento para obtener información sobre la configuración.
Consulta el siguiente ejemplo de una configuración para el seguimiento de capas de SurfaceFlinger:
unique_session_name: "surfaceflinger_layers_active"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
Consulta el siguiente comando de ejemplo para generar un registro de las capas de SurfaceFlinger:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
volcados de SurfaceFlinger (capas)
Para capturar volcados de SurfaceFlinger, haz lo siguiente:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
Transiciones de Shell
Los siguientes comandos se usan para el seguimiento de transiciones.
En el proceso system_server
, sucede lo siguiente:
Inicia un registro:
adb shell cmd window shell tracing start
Sigue estos pasos para detener un seguimiento:
adb shell cmd window shell tracing stop
Inicia un registro en WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
Detén un registro en WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
Los siguientes comandos se usan para el seguimiento del editor de métodos de entrada (IME):
Inicia el seguimiento de IME para los clientes de método de entrada (IM), el servicio de método de entrada (IMS) y el servicio de administración de métodos de entrada (IMMS):
adb shell ime tracing start
Inicia el seguimiento de clientes de IME, IMS y IMMS:
adb shell ime tracing stop
SurfaceFlinger (transacciones)
El registro de transacciones de SurfaceFlinger usa el registro de Perfetto para la captura. Consulta Configuración de seguimiento para obtener información sobre la configuración.
Consulta el siguiente ejemplo de una configuración de Perfetto para el registro activo de SurfaceFlinger:
unique_session_name: "surfaceflinger_transactions_active"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
write_into_file: true
file_write_period_ms: 100
Consulta el siguiente ejemplo de una configuración de Perfetto para el seguimiento continuo de SurfaceFlinger:
unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_CONTINUOUS
}
}
}
Consulta el siguiente comando de ejemplo para generar un registro de transacciones de SurfaceFlinger:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \