轨迹搜索

使用 SQL 在 Winscope Perfetto 轨迹中查找特定状态。您可以使用 Winscope 界面中的全局搜索查看器运行查询并直观呈现表格化结果:

“搜索查看器”标签页

图 1. “搜索查看器”标签页。

借助搜索查看器,您可以针对 Perfetto 轨迹编写和运行自定义 SQL 查询,以及访问近期查询和已保存的查询。Winscope 提供专用 SQL 视图,以帮助搜索 SurfaceFlinger 和事务轨迹。

请对所有视图使用以下惯例:

  • 对于 propertyflat_property 列:

    • 属性名称采用蛇形命名法,例如 LayerProto 中的 visible_region
    • 点表示法用于表示嵌套属性,例如 visible_region.rect

    • property 中的重复字段用方括号进行区分:

      例如,在重复字段 visible_region.rect 的两个实例中,top 字段分别由 visible_region.rect[0].topvisible_region.rect[1].top 表示。

    • flat_property 中的重复字段无法区分:

      例如,在重复字段 visible_region.rect 的两个实例中,top 字段在两个实例中都由 visible_region.rect.top 表示。

  • 对于 valueprevious_value 列:

    • 布尔值由 '0' (False) 或 '1' (True) 表示。

SurfaceFlinger SQL 视图

SurfaceFlinger proto 数据使用以下格式:

如需搜索图层数据,请使用 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'
    
  • 找到 Taskbarcolor.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. 搜索时间轴。