Используйте 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: форматLayerCreationArgsLAYER_CHANGED: форматLayerStateDISPLAY_ADDED: форматDisplayStateDISPLAY_CHANGED: форматDisplayStateLAYER_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, в том числе:
DisplayContentProtoDisplayAreaProtoTaskProtoActivityRecordProtoWindowTokenProtoWindowStateProtoTaskFragmentProtoWindowContainerProto
Чтобы найти данные 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. Поиск по временной шкале.