Búsqueda de seguimiento

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:

Pestaña del visualizador de búsqueda

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 y flat_property:

    • Los nombres de las propiedades están en formato snake_case, por ejemplo, visible_region de LayerProto.
    • 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 campo top se representa con visible_region.rect[0].top y visible_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 campo top se representa con visible_region.rect.top en ambas instancias.

  • En el caso de las columnas value y previous_value, los valores booleanos se representan con 0 (False) o 1 (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:

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: Formato LayerCreationArgs
  • LAYER_CHANGED: Formato LayerState
  • DISPLAY_ADDED: Formato DisplayState
  • DISPLAY_CHANGED: Formato DisplayState
  • LAYER_DESTROYED: Sin argumentos
  • LAYER_HANDLE_DESTROYED: Sin argumentos
  • DISPLAY_REMOVED: Sin argumentos
  • NOOP: 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:

Panel izquierdo del visor de búsqueda

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:

Resultados del buscador

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:

línea de tiempo de búsqueda

Figura 4: Línea de tiempo de búsqueda.