Поиск трассировки

Используйте SQL для поиска определенных состояний в трассировках Winscope Perfetto. Используйте глобальный просмотрщик поиска в пользовательском интерфейсе Winscope для запуска запросов и визуализации табличных результатов:

search viewer tab

Рисунок 1. Вкладка просмотра поиска.

Просмотрщик поиска позволяет вам писать и запускать пользовательские запросы SQL на трассах Perfetto, а также получать доступ к недавним и сохраненным запросам. Winscope предоставляет специализированные представления SQL для помощи в поиске трасс SurfaceFlinger, Transactions, Transitions и ViewCapture.

Используйте следующие соглашения для всех представлений:

  • Для столбцов property и flat_property :

    • Имена свойств указываются в регистре «змея», например, visible_region из LayerProto .
    • Точечная нотация представляет вложенные свойства, например, visible_region.rect .

    • Повторяющиеся поля в property выделяются квадратными скобками:

      Например, в двух экземплярах повторяющегося поля visible_region.rect top поле представлено как visible_region.rect[0].top и visible_region.rect[1].top .

    • Повторяющиеся поля в flat_property неразличимы:

      Например, в двух экземплярах повторяющегося поля visible_region.rect top поле представлено как visible_region.rect.top в обоих экземплярах.

  • Для столбцов value и previous_value логические значения представлены как 0 ( False ) или 1 ( True ).

Winscope создает эти представления, объединяя данные из таблиц, специфичных для трассировки, с таблицей Perfetto args . Вы можете напрямую запрашивать эти таблицы. В таблице args столбцы key , flat_key и display_value аналогичны столбцам представления property , flat_property и value соответственно.

таблица args :

Столбец Описание
arg_set_id Используется для связывания набора аргументов
flat_key Имя свойства из протосообщения, без учета повторяющихся полей
key Имя свойства из протосообщения с учетом повторяющихся полей
value_type Тип значения свойства
int_value Значение свойства, если тип значения — целое число
string_value Значение свойства, если тип значения — строка
real_value Значение свойства, если тип значения — действительный
display_value Значение свойства приведено к строке

Представления SQL SurfaceFlinger

Протоданные SurfaceFlinger используют следующие форматы:

  • Данные слоев представлены в формате LayerProto .

  • Данные корня иерархии находятся в формате LayersSnapshotProto .

Для поиска данных слоя используйте представление sf_layer_search . Это представление включает в себя следующие столбцы:

Столбец Описание
state_id Идентификатор строки записи, к которой принадлежит слой
ts Временная метка записи, к которой принадлежит слой
layer_id Идентификатор слоя
parent_id Идентификатор родительского слоя
layer_name Имя слоя
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущей записи в строковом формате

Для поиска данных корня иерархии используйте представление sf_hierarchy_root_search . Это представление включает следующие столбцы:

Столбец Описание
state_id Идентификатор строки записи
ts Временная метка записи
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущей записи в строковом формате

Примеры запросов

  • Найдите все кадры, где слой IME имеет допустимые границы экрана:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Найдите все кадры, где изменяется слой Taskbar color.a (альфа):

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Найти все кадры, где нижняя граница Wallpaper меньше или равна 2400:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Перечислите все свойства для дисплеев с допустимым стеком слоев:

    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, ']')
        ),
        '%'
      )
    
  • Найти все кадры, где виден жест «свайп назад»

    SELECT DISTINCT STATE.ts FROM sf_layer_search STATE
      WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
    

Таблицы данных

Представления SurfaceFlinger создаются с использованием следующих базовых таблиц.

surfaceflinger_layers_snapshot :

Столбец Описание
id Идентификатор строки для записи
ts Временная метка записи
arg_set_id Идентификатор, используемый для связывания строк из таблицы args с этой записью

surfaceflinger_layer :

Столбец Описание
id Идентификатор строки для слоя
snapshot_id Идентификатор строки записи из surfaceflinger_layers_snapshot , к которой принадлежит слой
arg_set_id Идентификатор, используемый для связывания строк из таблицы args с этим слоем

Просмотр транзакций SQL

Данные прототипа транзакций используют формат TransactionTraceEntry .

Для поиска данных трассировки транзакций используйте представление transactions_search . Это представление включает следующие столбцы:

Столбец Описание
state_id Идентификатор строки записи, к которой принадлежит свойство proto
ts Временная метка записи, к которой принадлежит свойство proto
transaction_id Идентификатор транзакции, если доступен
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате

Примеры запросов

  • Найдите кадр, в котором была применена транзакция для изменения положения слоя x на -54,0:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Найдите кадр, куда был добавлен слой ImeContainer :

    SELECT ts FROM transactions_search
      WHERE flat_property='added_layers.name'
      AND value='ImeContainer'
    

Таблицы данных

Представление SQL «Транзакции» создается с использованием следующих базовых таблиц.

surfaceflinger_transactions :

Столбец Описание
id Идентификатор строки для записи
ts Временная метка записи
arg_set_id Идентификатор, используемый для связывания строк из таблицы args с этой записью
vsync_id Идентификатор VSync, связанный со всеми транзакциями в этой записи

android_surfaceflinger_transaction :

Столбец Описание
id Идентификатор строки для транзакции
snapshot_id Идентификатор строки записи из surfaceflinger_transactions , к которой принадлежит транзакция
arg_set_id Идентификатор, используемый для связывания строк из таблицы args с этой транзакцией
transaction_id Идентификатор транзакции взят из протосообщения
pid PID транзакции взят из протосообщения
uid UID транзакции взят из протосообщения
layer_id Идентификатор слоя, связанного с транзакцией, если применимо
display_id Идентификатор отображения, связанного с транзакцией, если применимо
flags_id Идентификатор, используемый для получения связанных флагов из android_surfaceflinger_transaction_flag
transaction_type Тип транзакции

android_surfaceflinger_transaction_flag :

Столбец Описание
flags_id Соответствует значению в строке в android_surfaceflinger_transaction
flag Переведенная строка флага

Отдельные транзакции добавляются в таблицу args из разных форматов proto-сообщений в зависимости от типа транзакции:

  • LAYER_ADDED : Формат LayerCreationArgs
  • LAYER_CHANGED : Формат LayerState
  • DISPLAY_ADDED : Формат DisplayState
  • DISPLAY_CHANGED : Формат DisplayState
  • LAYER_DESTROYED : Нет аргументов
  • LAYER_HANDLE_DESTROYED : Нет аргументов
  • DISPLAY_REMOVED : Нет аргументов
  • NOOP : нет аргументов

Переходы SQL-представление

Протоданные переходов используют формат ShellTransition .

Для поиска данных Transitions используйте представление transitions_search . Это представление включает следующие столбцы:

Столбец Описание
ts Время отправки; возвращается к времени отправки, если доступно, в противном случае 0
transition_id Идентификатор перехода взят из прото-сообщения
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value UID транзакции взят из протосообщения

Примеры запросов

Найдите свойства переходов, обрабатываемых 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

Таблицы данных

Представление «Переходы» создается с использованием следующих базовых таблиц.

window_manager_shell_transitions :

Столбец Описание
id Идентификатор строки для перехода
ts Время отправки; возвращается к времени отправки, если доступно, в противном случае 0
transition_id Идентификатор перехода взят из прото-сообщения
arg_set_id Идентификатор, используемый для связывания строк из таблицы args с этим переходом
transition_type Тип перехода взят из прото сообщения
send_time_ns Время отправки перехода взято из прото-сообщения
dispatch_time_ns Время отправки перехода взято из прото-сообщения
duration_ns Продолжительность перехода, если известно время начала и окончания
handler Обработчик перехода: получить перевод из window_manager_shell_transition_handlers
status Статус перехода: played , merged или aborted
flags Флаги перехода взяты из сообщения proto

window_manager_shell_transition_handlers :

Столбец Описание
handler_id Идентификатор, соответствующий значению в столбце handler window_manager_shell_transitions
handler_name Перевод строки

android_window_manager_shell_transition_participants :

Столбец Описание
transition_id Идентификатор перехода взят из необработанного прото-сообщения
layer_id Идентификатор участника слоя SurfaceFlinger
window_id Идентификатор участника контейнера WindowManager

Просмотр SQL-представления ViewCapture

Протоданные ViewCapture используют формат View .

Для поиска данных ViewCapture используйте представление viewcapture_search . Это представление включает следующие столбцы:

Столбец Описание
state_id Идентификатор строки штата, к которому принадлежит представление
ts Временная метка штата, к которому относится представление
package_name Имя пакета
window_name Имя окна
class_name Просмотреть имя класса
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущего состояния в строковом формате

Примеры запросов

Найти все состояния, когда SearchContainerView перемещается в направлении Y:

  SELECT * FROM viewcapture_search
  WHERE class_name LIKE '%SearchContainerView'
    AND flat_property='translation_y'
    AND value!=previous_value

Таблицы данных

Представление ViewCapture создается с использованием следующих базовых таблиц.

android_viewcapture :

Столбец Описание
id Идентификатор строки для записи
ts Временная метка записи
arg_set_id Идентификатор, используемый для связывания строк из таблицы args с этой записью

android_viewcapture_view :

Столбец Описание
id Идентификатор строки для представления
snapshot_id Идентификатор строки записи из android_viewcapture , к которой принадлежит представление
arg_set_id Идентификатор, используемый для связывания строк из таблицы args с этим представлением

Таблица ProtoLog SQL

Proto-данные ProtoLog используют формат ProtoLogMessage . Это представление включает следующие столбцы:

Столбец Описание
ts Временная метка журнала
level Уровень журнала
tag Тег группы регистрации
message Сообщение журнала
stacktrace Stacktrace (если доступно)
location Код местоположения, из которого пришло сообщение

Примеры запросов

  • Найти все журналы с сообщением, содержащим transition :

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • Найдите все журналы, содержащие действительные идентификаторы транзакций:

    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, '%');
    

Выполнять запросы

Вы можете выполнять поисковые запросы с помощью панели ГЛОБАЛЬНОГО ПОИСКА в левой части окна просмотра поиска .

При первом взаимодействии с панелью GLOBAL SEARCH инициализируется поиск трассировки, а Winscope создает вспомогательные представления SQL. Это занимает несколько секунд. Пока инициализируется поиск трассировки, временная шкала недоступна.

Чтобы начать поиск, введите запрос в поле поиска и нажмите «Выполнить поисковый запрос» или нажмите клавишу Enter на клавиатуре, чтобы выполнить его.

После завершения таблица результатов отображается на средней панели. Ваш запрос отображается под полем поиска с полем для сохранения запроса между сеансами.

Вы можете получить доступ к сохраненным запросам, нажав на вкладку Сохраненные на левой панели, а также получить доступ к недавно выполненным запросам, нажав на вкладку Недавние :

search viewer left panel

Рисунок 2. Левая панель средства просмотра поиска.

Результаты

Все запросы возвращают табличные результаты, отображаемые в прокручиваемом виде с интерактивным поведением, аналогичным средствам просмотра трассировки на основе журналов, таким как Transactions и ProtoLog:

search viewer results

Рисунок 3. Результаты поиска.

Если полученная таблица содержит столбец ts , значения в этом столбце интерпретируются как временные метки и добавляются в наложение временной шкалы как новая строка записей. Щелкните эту строку и используйте клавиши со стрелками влево и вправо для перемещения между записями:

search timeline

Рисунок 4. Хронология поиска.