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

Рисунок 1. Вкладка «Поиск в окне просмотра».
Средство просмотра поиска позволяет писать и выполнять пользовательские SQL-запросы к трассировкам Perfetto. Вы также можете получить доступ к недавним и сохраненным запросам. Winscope предоставляет специализированные представления SQL для поиска в трассировках SurfaceFlinger, Transactions, Transitions и ViewCapture.
Для всех представлений используйте следующие соглашения:
Для столбцов
propertyиflat_property:- Названия свойств пишутся в стиле snake case, например,
visible_regionизLayerProto. Точечная нотация обозначает вложенные свойства, например,
visible_region.rect.Повторяющиеся поля в
propertyобозначаются квадратными скобками:Например, в двух экземплярах повторяющегося поля
visible_region.recttopполе представленоvisible_region.rect[0].topиvisible_region.rect[1].top.Повторяющиеся поля в
flat_propertyнеотличимы друг от друга:Например, в двух случаях, когда поле
visible_region.rectповторяется, полеtopв обоих случаях представлено значениемvisible_region.rect.top.
- Названия свойств пишутся в стиле snake case, например,
В столбцах
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, включая:
-
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 с этим представлением. |
Выполнить запросы
Вы можете выполнять поисковые запросы, используя панель «Глобальный поиск» в левой части окна просмотра результатов поиска .
При первом взаимодействии с панелью глобального поиска инициализируется трассировка поиска, и Winscope создает вспомогательные представления SQL. Это занимает несколько секунд. Пока выполняется инициализация трассировки поиска, временная шкала недоступна.
Чтобы начать поисковый запрос, введите запрос в поле поиска и нажмите кнопку «Выполнить поисковый запрос» или нажмите клавишу Enter на клавиатуре.
После завершения в средней панели отобразится таблица результатов. Ваш запрос появится под полем поиска, а также поле для сохранения запроса между сеансами.
Сохранённые запросы можно просмотреть, щёлкнув вкладку «Сохранённые» на левой панели, а недавно выполненные запросы — щёлкнув вкладку «Недавние» :

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

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

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