使用 SQL 在 Winscope Perfetto 轨迹中查找特定状态。您可以使用 Winscope 界面中的全局搜索查看器运行查询并直观呈现表格化结果:
图 1. “搜索查看器”标签页。
借助搜索查看器,您可以针对 Perfetto 轨迹编写和运行自定义 SQL 查询,以及访问近期查询和已保存的查询。Winscope 提供专用 SQL 视图,以帮助搜索 SurfaceFlinger 和事务轨迹。
请对所有视图使用以下惯例:
对于
property
和flat_property
列:- 属性名称采用蛇形命名法,例如
LayerProto
中的visible_region
。 点表示法用于表示嵌套属性,例如
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
) 表示。
- 布尔值由
SurfaceFlinger SQL 视图
SurfaceFlinger proto 数据使用以下格式:
图层数据采用
LayerProto
格式。层次结构根数据采用
LayersSnapshotProto
格式。
如需搜索图层数据,请使用 sf_layer_search
视图。此视图包含以下列:
Column | 说明 |
---|---|
state_id |
图层所属条目的唯一 ID |
ts |
图层所属条目的时间戳 |
layer_id |
图层 ID |
parent_id |
父级的图层 ID |
layer_name |
图层名称 |
property |
考虑重复字段的媒体资源名称 |
flat_property |
房源名称未考虑重复字段 |
value |
采用字符串格式的房源价值 |
previous_value |
上一个条目的属性值(字符串格式) |
如需搜索层次结构根数据,请使用 sf_hierarchy_root_search
视图。此视图包含以下列:
Column | 说明 |
---|---|
state_id |
条目的唯一 ID |
ts |
条目的时间戳 |
property |
考虑重复字段的媒体资源名称 |
flat_property |
房源名称未考虑重复字段 |
value |
采用字符串格式的房源价值 |
previous_value |
上一个条目中的属性值(采用字符串格式) |
查询示例
查找
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
(alpha)发生变化的所有帧: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, ']') ), '%' )
“交易”SQL 视图
交易 proto 数据使用 TransactionTraceEntry
格式。
如需搜索交易数据,请使用 transactions_search
视图。此视图包含以下列:
Column | 说明 |
---|---|
state_id |
proto 媒体资源所属条目的唯一 ID |
ts |
Proto 属性所属条目的时间戳 |
transaction_id |
交易 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 视图
转场 proto 数据使用 ShellTransition
格式。
如需搜索转换数据,请使用 transitions_search
视图。此视图包含以下列:
Column | 说明 |
---|---|
ts |
调度时间 - 回退到发送时间(如果有),否则为 0 |
transition_id |
转换 ID |
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
ViewCapture SQL 视图
ViewCapture proto 数据使用 View
格式。
如需搜索 ViewCapture 数据,请使用 viewcapture_search
视图。此视图包含以下列:
Column | 说明 |
---|---|
state_id |
视图所属状态的唯一 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
ProtoLog SQL 表
ProtoLog proto 数据使用 ProtoLogMessage
格式。此视图包含以下列:
Column | 说明 |
---|---|
ts |
日志的时间戳 |
level |
日志级别 |
tag |
日志记录组标记 |
message |
日志消息 |
stacktrace |
堆栈轨迹(如果有) |
location |
消息的来源代码位置 |
查询示例
查找包含
transition
消息的所有日志:SELECT ts, message, location FROM protolog WHERE message LIKE '%transition%'
查找包含有效交易 ID 的所有日志:
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, '%');
运行查询
当您使用左侧面板时,系统会开始轨迹搜索。此过程需要几秒钟的时间。在开始播放时,时间轴不可用。
轨迹搜索初始化后,在搜索框中编写查询,然后点击运行搜索查询或按键盘上的 Enter 键运行查询。
完成后,结果表会显示在中间面板中。您的查询会显示在搜索框下方,并有一个字段用于在会话之间保存查询。
您可以点击左侧面板中的已保存标签页来访问已保存的查询,也可以点击近期标签页来访问最近运行的查询:
图 2. 搜索查看器左侧面板。
结果
所有查询都会返回表格化结果,这些结果会显示在可滚动视图中,其互动行为类似于基于日志的轨迹查看器(例如事务和 ProtoLog):
图 3. 搜索查看器结果。
如果生成的表格包含 ts
列,则该列中的值会被解读为时间戳,并作为新行条目添加到时间轴叠加层。点击此行,然后使用向左键和向右键在条目之间移动:
图 4. 搜索时间轴。