Los registros 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 registros 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 los parámetros de configuración de forma individual o en una sola sesión de registro.
En Android 14 y versiones anteriores, cada registro de Winscope tiene un comando diferente y puedes recopilarlos 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 máxima cantidad de información.LOG_LEVEL_DEBUG
: Registra todos los elementos, pero no escribe todos los datos de configuración.LOG_LEVEL_CRITICAL
: Registra solo los elementos visibles, con la menor sobrecarga de rendimiento posible.
Frecuencia de registro (
log_frequency
): Define la frecuencia con la que se registran los elementos:LOG_FREQUENCY_FRAME
: Registra instantáneas del estado cuando se confirma un fotograma.LOG_FREQUENCY_TRANSACTION
: Registra instantáneas del estado cada vez que se confirma una transacción.LOG_FREQUENCY_SINGLE_DUMP
: Realiza un seguimiento de las instantáneas de un solo estado cuando se inicia la fuente de datos.
Consulta WindowManager para obtener detalles sobre los valores de configuración.
Ejemplo
A continuación, se muestra un ejemplo del tipo de registro 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
: Solo se registran los grupos y niveles de registro especificados engroup_overrides
.ENABLE_ALL
: Registra 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 configura, se realizará un seguimiento de cualquier mensaje con un nivel de registro superior o igual 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 los 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
Invalidaciones de grupos (group_overrides
): Permite configurar manualmente el 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
: Es 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 que se está rastreando.
Ejemplo
A continuación, se muestra 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 el seguimiento de entrada debe iniciarse con reglas que preservan la privacidad o 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 registro definidas en esta configuración para especificar qué eventos se deben registrar. Consultaandroid_input_event_config.proto
para obtener más información sobre cómo especificar las reglas del registro.
Ejemplo
A continuación, se muestra un ejemplo del tipo de registro 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 seguimiento (mode
): Define la frecuencia con la que se registran los elementos:
MODE_ACTIVE
: Registra instantáneas de las 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 conservan en el búfer de anillo interno de SurfaceFlinger. La generación de instantáneas de la capa se produce cuando se vacía esta fuente de datos.MODE_DUMP
: Registra el seguimiento de una sola instantánea de capas.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 vacía un registro.
Marcas de seguimiento (trace_flags
):
TRACE_FLAG_INPUT
: Si la superficie contiene datos de entrada, hace un seguimiento de los detalles de la ventana de entrada.TRACE_FLAG_COMPOSITION
: Registra el tipo de composición y la región visible.TRACE_FLAG_EXTRA
: Registra metadatos adicionales de la superficie, incluidas las capas fuera de la pantalla.TRACE_FLAG_HWC
: Registra metadatos adicionales no estructurados del compositor de hardware.TRACE_FLAG_BUFFERS
: Configura SurfaceFlinger para registrar todos los cambios de búfer en la superficie. De forma predeterminada, SurfaceFlinger registra un nuevo estado solo cuando se producen alteraciones en la geometría.TRACE_FLAG_VIRTUAL_DISPLAYS
: Incluye capas de pantalla virtual en el registro.
Ejemplo
A continuación, se muestra un ejemplo del tipo de registro 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
A continuación, se muestra un ejemplo del tipo de registro 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 registro.
Opciones de configuración
Modo de seguimiento (mode
): Define la frecuencia con la que se registran los elementos:
MODE_CONTINUOUS
: SurfaceFlinger escribe su búfer de anillo interno de transacciones cada vez que se vacía la fuente de datos. El búfer de anillo 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
A continuación, se muestra 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
A continuación, se muestra un ejemplo del tipo de registro 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
A continuación, se muestra un ejemplo del tipo de registro 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 múltiples fuentes en una sola configuración. Puedes recopilar todos los registros 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 registros en Android 14 y versiones anteriores
Ejecuta adb root
antes de ejecutar los comandos de adb shell
para cada uno de los siguientes registros. 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 a un dispositivo y desde él.
Registros de WindowManager
Sigue estos pasos para capturar registros de WindowManager:
Habilita el registro:
adb shell wm tracing start
Inhabilita el registro:
adb shell wm tracing stop
Cómo guardar los datos de registro en un archivo mientras se ejecuta 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
Estado de impresión 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 de system_server
, sucede lo siguiente:
Cómo iniciar ProtoLog:
adb shell cmd window logging start
Detener ProtoLog:
adb shell cmd window logging stop
Habilita ProtoLog para los grupos de registros determinados:
adb shell cmd window logging enable [group...]
Inhabilita ProtoLog para los grupos de registros determinados:
adb shell cmd window logging disable [group...]
Habilita el registro de Logcat para los grupos de registros determinados:
adb shell cmd window logging enable-text [group...]
Inhabilita el registro de Logcat para los grupos de registros determinados:
adb shell cmd window logging disable-text [group...]
En WMShell:
Cómo iniciar ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
Registros de SurfaceFlinger (capas)
El registro de la capa SurfaceFlinger usa el registro de Perfetto para la captura. Consulta Configuración del registro de seguimiento para obtener información sobre la configuración.
Consulta el siguiente ejemplo de una configuración para el registro 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 ejemplo de comando para generar un registro de las capas de SurfaceFlinger:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
Volcado 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 registro de seguimiento de transiciones.
En el proceso de system_server
, sucede lo siguiente:
Sigue estos pasos para iniciar un registro:
adb shell cmd window shell tracing start
Sigue estos pasos para detener un registro:
adb shell cmd window shell tracing stop
Inicia un registro en WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
Para detener un registro en WMShell, haz lo siguiente:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
Los siguientes comandos se usan para el registro del Editor de métodos de entrada (IME):
Inicia el registro del IME para los clientes del método de entrada (IM), el servicio del método de entrada (IMS) y el servicio de administración del método de entrada (IMMS):
adb shell ime tracing start
Inicia el registro de los clientes del 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 del registro 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 registro 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 \