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

Рисунок 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 создаёт эти представления, объединяя данные из таблиц, специфичных для трассировки, с таблицей args Perfetto . Вы можете выполнять запросы к этим таблицам напрямую. В таблице args столбцы key , flat_key и display_value аналогичны столбцам представления property , flat_property и value соответственно.
 таблица args :
| Столбец | Описание | 
|---|---|
| arg_set_id | Используется для связывания набора аргументов | 
| flat_key | Имя свойства из сообщения proto, без учета повторяющихся полей | 
| 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 | Идентификатор строки записи, к которой принадлежит свойство proto | 
| 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 | Идентификатор транзакции взят из прото-сообщения | 
| 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 | Флаги перехода взяты из прото-сообщения | 
 window_manager_shell_transition_handlers :
| Столбец | Описание | 
|---|---|
| handler_id | Идентификатор, соответствующий значению в столбце handlerwindow_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с этим представлением | 
Таблица ProtoLog SQL
 Данные 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, '%');
SQL-представление WindowManager
 Данные прототипа WindowManager используют иерархический формат WindowManagerServiceDumpProto . Вы можете искать свойства любого контейнера WindowManager, включая:
-  DisplayContentProto
-  DisplayAreaProto
-  TaskProto
-  ActivityRecordProto
-  WindowTokenProto
-  WindowStateProto
-  TaskFragmentProto
-  WindowContainerProto
 Для поиска данных 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. Это занимает несколько секунд. Во время инициализации поиска трассировки временная шкала недоступна.
Чтобы начать поиск, напишите запрос в поле поиска и нажмите «Выполнить поисковый запрос» или нажмите клавишу Enter на клавиатуре, чтобы выполнить его.
После завершения поиска таблица результатов отобразится на средней панели. Ваш запрос появится под строкой поиска с полем для сохранения запроса между сеансами.
Вы можете получить доступ к сохраненным запросам, щелкнув вкладку Сохраненные на левой панели, а также получить доступ к недавно выполненным запросам, щелкнув вкладку Недавние :

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

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

Рисунок 4. Временная шкала поиска.
