Usa SQL para encontrar estados específicos en los seguimientos de Perfetto de Winscope. Usa el visor global de Búsqueda en la IU de Winscope para ejecutar consultas y visualizar los resultados tabulados:
Figura 1: Pestaña Buscar (Search) del usuario.
El visor de búsqueda te permite escribir y ejecutar consultas de SQL personalizadas en los registros de Perfetto y acceder a las consultas recientes y guardadas. Winscope proporciona vistas de SQL especializadas para ayudar a buscar seguimientos de SurfaceFlinger y transacciones.
Usa las siguientes convenciones para todas las vistas:
Para columnas
property
yflat_property
:- Los nombres de las propiedades están en mayúsculas y minúsculas, por ejemplo,
visible_region
deLayerProto
. Se usa una notación de puntos para representar 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
está representado porvisible_region.rect[0].top
yvisible_region.rect[1].top
.Los campos repetidos en
flat_property
no se distinguen:Por ejemplo, dentro de dos instancias del campo repetido
visible_region.rect
, el campotop
está representado porvisible_region.rect.top
en ambas instancias.
- Los nombres de las propiedades están en mayúsculas y minúsculas, por ejemplo,
Para columnas
value
yprevious_value
:- Los valores booleanos se representan con
'0'
(False
) o'1'
(True
).
- Los valores booleanos se representan con
Vistas de SQL de SurfaceFlinger
Los datos de proto de SurfaceFlinger usan estos formatos:
Los datos de la capa están en formato
LayerProto
.Los datos de la raíz de la jerarquía están en formato
LayersSnapshotProto
.
Para buscar datos de capas, usa la vista sf_layer_search
. Esta vista incluye las siguientes columnas:
Column | Descripción |
---|---|
state_id |
Es el ID único 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 superior |
layer_name |
Nombre de la capa |
property |
Registro del nombre de la propiedad para 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 |
Es el valor de la propiedad de la entrada anterior en formato de cadena. |
Para buscar datos de raíz de jerarquía, usa la vista sf_hierarchy_root_search
. Esta vista incluye las siguientes columnas:
Column | Descripción |
---|---|
state_id |
ID único de la entrada |
ts |
Marca de tiempo de la entrada |
property |
Registro del nombre de la propiedad para 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 |
Es el valor de la propiedad de la entrada anterior en formato de cadena. |
Consultas de ejemplo
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
Busca todas las tramas en las que el límite inferior de
Wallpaper
sea menor o igual que 2,400:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name LIKE 'Wallpaper%' AND property='bounds.bottom' AND cast_int!(value) <= 2400
Muestra una lista de 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, ']') ), '%' )
Vista de SQL de Transactions
Los datos de proto de transacciones usan el formato TransactionTraceEntry
.
Para buscar datos de transacciones, usa la vista transactions_search
. Esta vista incluye las siguientes columnas:
Column | Descripción |
---|---|
state_id |
Es el ID único de la entrada a la que pertenece la propiedad proto. |
ts |
Marca de tiempo de la entrada a la que pertenece la propiedad proto |
transaction_id |
ID de transacción (si está disponible) |
property |
Registro del nombre de la propiedad para 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 |
Consultas de ejemplo
Busca el fotograma en el que se aplicó una transacción para cambiar la posición de la capa X a -54.0:
SELECT ts, transaction_id, value FROM transactions_search WHERE flat_property='transactions.layer_changes.x' AND value='-54.0'
Busca el marco en el que se agregó la capa
ImeContainer
:SELECT ts FROM transactions_search WHERE flat_property='added_layers.name' AND value='ImeContainer'
Vista de SQL de Transitions
Los datos de proto de transición usan el formato ShellTransition
.
Para buscar datos de transiciones, usa la vista transitions_search
. Esta vista incluye las siguientes columnas:
Column | Descripción |
---|---|
ts |
Tiempo de despacho: Si está disponible, se usa la hora de envío; de lo contrario, se usa 0 . |
transition_id |
ID de transición |
property |
Registro del nombre de la propiedad para 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 |
Consultas de ejemplo
Encuentra las propiedades de las transiciones que controla 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
Vista de SQL de ViewCapture
Los datos de proto de ViewCapture usan el formato View
.
Para buscar datos de ViewCapture, usa la vista viewcapture_search
. Esta vista incluye las siguientes columnas:
Column | Descripción |
---|---|
state_id |
Es el ID único 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 |
Cómo ver el nombre de la clase |
property |
Registro del nombre de la propiedad para 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 |
Es el valor de la propiedad del estado anterior en formato de cadena. |
Consultas de ejemplo
Busca 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
Tabla de SQL de ProtoLog
Los datos de proto de ProtoLog usan el formato ProtoLogMessage
. Esta vista incluye las siguientes columnas:
Column | 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 |
Consultas de ejemplo
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
Cuando usas el panel izquierdo, se inicia la búsqueda de seguimiento. Este proceso tardará unos segundos. Mientras se inicia, la línea de tiempo no está disponible.
Después de inicializar la búsqueda de seguimiento, escribe una consulta en el cuadro de búsqueda y haz clic en Run Search Query o presiona Intro en el teclado para ejecutarla.
Cuando termines, la tabla de resultados aparecerá en el panel del medio. Tu consulta aparecerá debajo del cuadro de búsqueda, con un campo para guardarla entre sesiones.
Para acceder a las consultas guardadas, haz clic en la pestaña Guardados en el panel izquierdo, y 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 muestran resultados tabulados, que se muestran en una vista desplazable con un comportamiento interactivo similar al de los visores de seguimiento 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 cronograma como una fila nueva 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.