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

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

search viewer tab

Рисунок 1. Вкладка «Поиск в окне просмотра».

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

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

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

    • Названия свойств пишутся в стиле snake case, например, 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 создает эти представления, объединяя данные из таблиц, специфичных для трассировки, с таблицей args Perfetto . Вы можете напрямую запрашивать данные из этих таблиц. В таблице 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 Название слоя
is_visible Видимость слоя
property Название объекта недвижимости с учетом повторяющихся полей
flat_property Название объекта недвижимости не учитывает повторяющиеся поля.
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущей записи в строковом формате

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

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

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

  • Найдите все кадры, в которых виден слой IME :

    SELECT DISTINCT ts, layer_id, layer_name FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND is_visible=1
    
  • Найдите все кадры, в которых слой IME имеет допустимые границы экрана:

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

    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 из различных форматов протокольных сообщений в зависимости от типа транзакции:

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

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

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

Для поиска данных о переходах используйте представление 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 Флаги перехода взяты из прототипа сообщения.

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

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

В данных протокола 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 с этим представлением.

Таблица SQL ProtoLog

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

Столбец Описание
ts Отметка времени записи в журнале
level Уровень лога
tag Метка группы логирования
message Сообщение журнала
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, '%');
    

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

В данных протокола WindowManager используется иерархический формат WindowManagerServiceDumpProto . Вы можете искать свойства любого контейнера WindowManager, включая:

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

Столбец Описание
state_id Идентификатор строки штата, к которому принадлежит контейнер.
ts Отметка времени штата, к которому принадлежит контейнер.
title Название контейнера
token Токен контейнера
parent_token Токен родительского контейнера
is_visible Видимость контейнера
property Название объекта недвижимости с учетом повторяющихся полей
flat_property Название объекта недвижимости не учитывает повторяющиеся поля.
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущего состояния в строковом формате

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

  • Найдите все состояния, в которых LauncherActivity виден:

    SELECT DISTINCT ts, title, token FROM wm_search
      WHERE title like '%LauncherActivity%'
      AND is_visible=1
    
  • Найдите все состояния, в которых поверхность Wallpaper движется:

    SELECT ts, value, previous_value FROM wm_search
      WHERE title like '%Wallpaper%'
      AND property like '%surface_position%'
      AND value != previous_value
    

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

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

android_windowmanager :

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

android_windowmanager_windowcontainer :

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

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

Вы можете выполнять поисковые запросы, используя панель «Глобальный поиск» в левой части окна просмотра результатов поиска .

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

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

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

Сохранённые запросы можно просмотреть, щёлкнув вкладку «Сохранённые» на левой панели, а недавно выполненные запросы — щёлкнув вкладку «Недавние» :

search viewer left panel

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

Результаты

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

search viewer results

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

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

search timeline

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