Usa SQL para encontrar estados específicos en los registros de Winscope Perfetto. Usa el visor de búsqueda global en la IU de Winscope para ejecutar consultas y visualizar los resultados tabulados:
Figura 1: Pestaña del visor de búsqueda.
El visor de Search te permite escribir y ejecutar consultas de SQL personalizadas en los registros de Perfetto, así como acceder a las consultas recientes y guardadas. Winscope proporciona vistas SQL especializadas para ayudar a buscar registros de SurfaceFlinger, Transactions, Transitions y ViewCapture.
Usa las siguientes convenciones para todas las vistas:
Para las columnas
property
yflat_property
:- Los nombres de las propiedades están en formato snake_case, por ejemplo,
visible_region
deLayerProto
. La notación de puntos representa propiedades anidadas, por ejemplo,
visible_region.rect
.Los campos repetidos en
property
se distinguen con corchetes:Por ejemplo, dentro de dos instancias del campo repetido
visible_region.rect
, el campotop
se representa convisible_region.rect[0].top
yvisible_region.rect[1].top
.Los campos repetidos en
flat_property
no se pueden distinguir:Por ejemplo, dentro de dos instancias del campo repetido
visible_region.rect
, el campotop
se representa convisible_region.rect.top
en ambas instancias.
- Los nombres de las propiedades están en formato snake_case, por ejemplo,
En el caso de las columnas
value
yprevious_value
, los valores booleanos se representan con0
(False
) o1
(True
).
Winscope crea estas vistas combinando datos de tablas específicas del registro con la tabla args
de Perfetto.
Puedes consultar estas tablas directamente. En la tabla args
, las columnas key
, flat_key
y display_value
son análogas a las columnas de vista property
, flat_property
y value
, respectivamente.
Tabla args
:
Columna | Descripción |
---|---|
arg_set_id |
Se usa para asociar un conjunto de argumentos. |
flat_key |
Nombre de la propiedad del mensaje .proto, sin tener en cuenta los campos repetidos |
key |
Nombre de la propiedad del mensaje .proto, que tiene en cuenta los campos repetidos |
value_type |
Tipo de valor de la propiedad |
int_value |
Valor de la propiedad si el tipo de valor es un número entero |
string_value |
Valor de la propiedad si el tipo de valor es una cadena |
real_value |
Valor de la propiedad si el tipo de valor es real |
display_value |
Valor de la propiedad convertido en cadena |
Vistas de SQL de SurfaceFlinger
Los datos de SurfaceFlinger proto usan estos formatos:
Los datos de la capa están en formato
LayerProto
.Los datos raíz de la jerarquía están en formato
LayersSnapshotProto
.
Para buscar datos de la capa, usa la vista sf_layer_search
. Esta vista incluye las siguientes columnas:
Columna | Descripción |
---|---|
state_id |
ID de fila de la entrada a la que pertenece la capa |
ts |
Marca de tiempo de la entrada a la que pertenece la capa |
layer_id |
ID de la capa |
parent_id |
ID de la capa principal |
layer_name |
Nombre de la capa |
property |
Nombre de la propiedad que tiene en cuenta los campos repetidos |
flat_property |
El nombre de la propiedad no tiene en cuenta los campos repetidos |
value |
Valor de la propiedad en formato de cadena |
previous_value |
Valor de la propiedad de la entrada anterior en formato de cadena |
Para buscar datos raíz de la jerarquía, usa la vista sf_hierarchy_root_search
. Esta vista incluye las siguientes columnas:
Columna | Descripción |
---|---|
state_id |
ID de fila de la entrada |
ts |
Marca de tiempo de la entrada |
property |
Nombre de la propiedad que tiene en cuenta los campos repetidos |
flat_property |
El nombre de la propiedad no tiene en cuenta los campos repetidos |
value |
Valor de la propiedad en formato de cadena |
previous_value |
Valor de la propiedad de la entrada anterior en formato de cadena |
Ejemplos de búsquedas
Busca todos los fotogramas en los que la capa
IME
tenga límites de pantalla válidos:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'IME%' AND property='screen_bounds.bottom' AND value<='24000'
Busca todos los fotogramas en los que cambia la capa
Taskbar
color.a
(alfa):SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'Taskbar%' AND property='color.a' AND value!=previous_value
Encuentra todos los fotogramas en los que el límite inferior de
Wallpaper
es menor o igual que 2400:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name LIKE 'Wallpaper%' AND property='bounds.bottom' AND cast_int!(value) <= 2400
Enumera todas las propiedades de las pantallas con una pila de capas válida:
SELECT STATE.* FROM sf_hierarchy_root_search STATE_WITH_DISPLAY_ON INNER JOIN sf_hierarchy_root_search STATE ON STATE.state_id = STATE_WITH_DISPLAY_ON.state_id AND STATE_WITH_DISPLAY_ON.flat_property='displays.layer_stack' AND STATE_WITH_DISPLAY_ON.value!='4294967295' AND STATE.property LIKE CONCAT( SUBSTRING( STATE_WITH_DISPLAY_ON.property, 0, instr(STATE_WITH_DISPLAY_ON.property, ']') ), '%' )
Encuentra todos los fotogramas en los que se ve el gesto de deslizar para volver.
SELECT DISTINCT STATE.ts FROM sf_layer_search STATE WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
Tablas de datos
Las vistas de SurfaceFlinger se crean con las siguientes tablas subyacentes.
surfaceflinger_layers_snapshot
:
Columna | Descripción |
---|---|
id |
ID de fila de la entrada |
ts |
Marca de tiempo de la entrada |
arg_set_id |
Es el ID que se usa para asociar filas de la tabla args con esta entrada. |
surfaceflinger_layer
:
Columna | Descripción |
---|---|
id |
ID de fila de la capa |
snapshot_id |
ID de fila de la entrada de surfaceflinger_layers_snapshot a la que pertenece la capa |
arg_set_id |
Es el ID que se usa para asociar las filas de la tabla args con esta capa. |
Vista de SQL de transacciones
Los datos de proto de transacciones usan el formato TransactionTraceEntry
.
Para buscar datos de seguimiento de transacciones, usa la vista transactions_search
. Esta vista incluye las siguientes columnas:
Columna | Descripción |
---|---|
state_id |
ID de la fila de la entrada a la que pertenece la propiedad del proto |
ts |
Es la marca de tiempo de la entrada a la que pertenece la propiedad del proto. |
transaction_id |
ID de transacción (si está disponible) |
property |
Nombre de la propiedad que tiene en cuenta los campos repetidos |
flat_property |
El nombre de la propiedad no tiene en cuenta los campos repetidos |
value |
Valor de la propiedad en formato de cadena |
Ejemplos de búsquedas
Busca el fotograma en el que se aplicó una transacción para cambiar la posición X de la capa a -54.0:
SELECT ts, transaction_id, value FROM transactions_search WHERE flat_property='transactions.layer_changes.x' AND value='-54.0'
Busca el fotograma en el que se agregó la capa
ImeContainer
:SELECT ts FROM transactions_search WHERE flat_property='added_layers.name' AND value='ImeContainer'
Tablas de datos
La vista SQL de Transactions se crea con las siguientes tablas subyacentes.
surfaceflinger_transactions
:
Columna | Descripción |
---|---|
id |
ID de fila de la entrada |
ts |
Marca de tiempo de la entrada |
arg_set_id |
Es el ID que se usa para asociar filas de la tabla args con esta entrada. |
vsync_id |
ID de VSync asociado a todas las transacciones de esta entrada |
android_surfaceflinger_transaction
:
Columna | Descripción |
---|---|
id |
ID de la fila de la transacción |
snapshot_id |
ID de fila de la entrada de surfaceflinger_transactions a la que pertenece la transacción |
arg_set_id |
Es el ID que se usa para asociar filas de la tabla args con esta transacción. |
transaction_id |
ID de transacción tomado del mensaje .proto |
pid |
PID de la transacción que se tomó del mensaje .proto |
uid |
UID de transacción tomado del mensaje .proto |
layer_id |
ID de la capa asociada a la transacción, si corresponde |
display_id |
ID de la pantalla asociada a la transacción, si corresponde |
flags_id |
Es el ID que se usa para recuperar las marcas asociadas de android_surfaceflinger_transaction_flag . |
transaction_type |
Tipo de transacción |
android_surfaceflinger_transaction_flag
:
Columna | Descripción |
---|---|
flags_id |
Corresponde al valor de una fila en android_surfaceflinger_transaction . |
flag |
Cadena de la marca traducida |
Las transacciones individuales se agregan a la tabla de argumentos desde diferentes formatos de mensajes .proto según su tipo de transacción:
LAYER_ADDED
: FormatoLayerCreationArgs
LAYER_CHANGED
: FormatoLayerState
DISPLAY_ADDED
: FormatoDisplayState
DISPLAY_CHANGED
: FormatoDisplayState
LAYER_DESTROYED
: Sin argumentosLAYER_HANDLE_DESTROYED
: Sin argumentosDISPLAY_REMOVED
: Sin argumentosNOOP
: Sin argumentos
Vista de SQL de Transitions
Los datos de proto de las transiciones usan el formato ShellTransition
.
Para buscar datos de Transiciones, usa la vista transitions_search
. Esta vista incluye las siguientes columnas:
Columna | Descripción |
---|---|
ts |
Hora de envío. Si está disponible, se recurre a la hora de envío; de lo contrario, se recurre a 0 . |
transition_id |
ID de transición que se toma del mensaje .proto |
property |
Nombre de la propiedad que tiene en cuenta los campos repetidos |
flat_property |
El nombre de la propiedad no tiene en cuenta los campos repetidos |
value |
UID de transacción tomado del mensaje .proto |
Ejemplos de búsquedas
Encuentra propiedades de las transiciones controladas por el DefaultMixedHandler
:
SELECT
PROPS.ts,
PROPS.transition_id,
PROPS.property,
PROPS.value
FROM transitions_search HANDLER_MATCH
INNER JOIN transitions_search PROPS
ON HANDLER_MATCH.transition_id = PROPS.transition_id
WHERE HANDLER_MATCH.property = 'handler'
AND HANDLER_MATCH.value LIKE "%DefaultMixedHandler"
ORDER BY PROPS.transition_id, PROPS.property
Tablas de datos
La vista Transitions se crea con las siguientes tablas subyacentes.
window_manager_shell_transitions
:
Columna | Descripción |
---|---|
id |
ID de fila para la transición |
ts |
Hora de envío. Si está disponible, se recurre a la hora de envío; de lo contrario, se recurre a 0 . |
transition_id |
ID de transición que se toma del mensaje .proto |
arg_set_id |
Es el ID que se usa para asociar las filas de la tabla args con esta transición. |
transition_type |
Tipo de transición que se toma del mensaje .proto |
send_time_ns |
Tiempo de transición de envío tomado del mensaje .proto |
dispatch_time_ns |
Hora de envío de la transición que se toma del mensaje .proto |
duration_ns |
Duración de la transición, si hay horas de inicio y finalización disponibles |
handler |
Controlador de transición: Recupera la traducción de window_manager_shell_transition_handlers |
status |
Estado de transición: played , merged o aborted |
flags |
Marcas de transición tomadas del mensaje .proto |
window_manager_shell_transition_handlers
:
Columna | Descripción |
---|---|
handler_id |
ID correspondiente al valor de la columna handler de window_manager_shell_transitions |
handler_name |
Traducción de cadenas |
android_window_manager_shell_transition_participants
:
Columna | Descripción |
---|---|
transition_id |
ID de transición tomado del mensaje .proto sin procesar |
layer_id |
ID del participante de la capa de SurfaceFlinger |
window_id |
ID del participante del contenedor de WindowManager |
Vista SQL de ViewCapture
Los datos de ViewCapture proto usan el formato View
.
Para buscar datos de ViewCapture, usa la vista viewcapture_search
. Esta vista incluye las siguientes columnas:
Columna | Descripción |
---|---|
state_id |
ID de fila del estado al que pertenece la vista |
ts |
Marca de tiempo del estado al que pertenece la vista |
package_name |
Nombre de paquete |
window_name |
Nombre de la ventana |
class_name |
Ver el nombre de la clase |
property |
Nombre de la propiedad que tiene en cuenta los campos repetidos |
flat_property |
El nombre de la propiedad no tiene en cuenta los campos repetidos |
value |
Valor de la propiedad en formato de cadena |
previous_value |
Valor de la propiedad del estado anterior en formato de cadena |
Ejemplos de búsquedas
Encuentra todos los estados cuando SearchContainerView
se movió en la dirección Y:
SELECT * FROM viewcapture_search
WHERE class_name LIKE '%SearchContainerView'
AND flat_property='translation_y'
AND value!=previous_value
Tablas de datos
La vista ViewCapture se crea con las siguientes tablas subyacentes.
android_viewcapture
:
Columna | Descripción |
---|---|
id |
ID de fila de la entrada |
ts |
Marca de tiempo de la entrada |
arg_set_id |
Es el ID que se usa para asociar filas de la tabla args con esta entrada. |
android_viewcapture_view
:
Columna | Descripción |
---|---|
id |
ID de fila de la vista |
snapshot_id |
ID de la fila de la entrada de android_viewcapture a la que pertenece la vista |
arg_set_id |
Es el ID que se usa para asociar filas de la tabla args con esta vista. |
Tabla de SQL de ProtoLog
Los datos de ProtoLog proto usan el formato ProtoLogMessage
. Esta vista incluye las siguientes columnas:
Columna | Descripción |
---|---|
ts |
Marca de tiempo del registro |
level |
Nivel de registro |
tag |
Etiqueta de grupo de registro |
message |
Mensaje de registro |
stacktrace |
Seguimiento de pila (si está disponible) |
location |
Ubicación del código desde la que se origina el mensaje |
Ejemplos de búsquedas
Busca todos los registros con un mensaje que contenga
transition
:SELECT ts, message, location FROM protolog WHERE message LIKE '%transition%'
Busca todos los registros que contengan IDs de transacción válidos:
CREATE PERFETTO VIEW valid_tx_ids AS SELECT DISTINCT transaction_id FROM transactions_search WHERE transaction_id IS NOT NULL AND transaction_id != '0'; SELECT TRANS.transaction_id, message FROM valid_tx_ids TRANS INNER JOIN protolog LOGS ON LOGS.message LIKE CONCAT('%', TRANS.transaction_id, '%');
Ejecuta consultas
Puedes ejecutar búsquedas con el panel GLOBAL SEARCH que se encuentra a la izquierda del visor de Search.
Cuando interactúas por primera vez con el panel de BÚSQUEDA GLOBAL, se inicializa la búsqueda de registros y Winscope crea las vistas de SQL auxiliares. Este proceso tarda unos segundos. Mientras se inicializa la búsqueda de registros, la línea de tiempo no está disponible.
Para iniciar una búsqueda, escribe una consulta en el cuadro de búsqueda y haz clic en Ejecutar búsqueda o presiona Intro en el teclado para ejecutarla.
Cuando termines, la tabla de resultados se mostrará en el panel central. Tu búsqueda aparece debajo del cuadro de búsqueda, con un campo para guardar la búsqueda entre sesiones.
Para acceder a las consultas guardadas, haz clic en la pestaña Guardadas en el panel izquierdo. Para acceder a las consultas ejecutadas recientemente, haz clic en la pestaña Recientes:
Figura 2: Panel izquierdo del visor de búsqueda.
Resultados
Todas las consultas devuelven resultados tabulados, que se muestran en una vista desplazable con un comportamiento interactivo similar a los visores de registros basados en registros, como Transactions y ProtoLog:
Figura 3: Resultados del visor de búsqueda.
Si la tabla resultante contiene una columna ts
, los valores de esa columna se interpretan como marcas de tiempo y se agregan a la superposición de la línea de tiempo como una nueva fila de entradas. Haz clic en esta fila y usa las teclas de flecha hacia la izquierda y la derecha para navegar entre las entradas:
Figura 4: Línea de tiempo de búsqueda.