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

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

вкладка поиска в средстве просмотра;

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

В окне Search (Поиск) можно писать и выполнять 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 объединяет данные из таблиц, относящихся к трассировке, с таблицей 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'
    
  • Найдите все кадры, в которых меняется 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 Идентификатор строки записи, к которой относится свойство протокола.
ts Временная метка записи, к которой относится свойство протокола.
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 Идентификатор транзакции, взятый из сообщения proto
pid Идентификатор транзакции, полученный из протокола сообщения
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_search. В этом представлении есть следующие столбцы:

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

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

Как найти свойства переходов, обрабатываемых 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 Тип перехода, взятый из сообщения proto
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 Идентификатор перехода, взятый из необработанного сообщения proto
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 proto используют формат 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 с этим представлением.

Как выполнять запросы

Вы можете выполнять поисковые запросы, используя панель ГЛОБАЛЬНЫЙ ПОИСК слева от окна Поиск.

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

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

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

Чтобы посмотреть сохраненные запросы, нажмите на вкладку Сохраненные на панели слева. Чтобы посмотреть недавно выполненные запросы, нажмите на вкладку Недавние.

Поиск на левой панели читателя

Рисунок 2. Поиск на левой панели просмотра.

Результаты

Все запросы возвращают результаты в виде таблицы, которую можно прокручивать. Взаимодействие с таблицей аналогично тому, как это происходит в средствах просмотра трассировки на основе журналов, например в инструментах "Транзакции" и ProtoLog.

результаты поиска зрителей;

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

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

временная шкала поиска;

Рисунок 4. Поиск по временной шкале.