安卓闪黑工具:aosp16版本Winscope之搜索功能剖析

AOSP16 Winscope搜索功能详解

背景:

在aosp16的Winscope体验时候发现多了数据的搜索功能,也体验了一下,这个新功能本身Winscope也自带了很多指导提示,主要是用来解决Winscope有时候寻找某个数据,某个layer时候的不便,本文来详细介绍一下这块搜索如何使用的内容。
体验Winscope搜索功能相关:
在这里插入图片描述

Winscope上数据记录搜索

使用 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 视图。此视图包含以下列:

列	说明
state_id	图层所属条目的唯一 ID
ts	图层所属条目的时间戳
layer_id	图层 ID
parent_id	父级的图层 ID
layer_name	图层名称
property	考虑重复字段的属性名称
flat_property	属性名称不考虑重复字段
value	以字符串格式显示的属性值
previous_value	上一个条目的属性值(字符串格式)

如需搜索层次结构根数据,请使用 sf_hierarchy_root_search 视图。此视图包含以下列:

列	说明
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'

注意:我们计划向 SurfaceFlinger 跟踪记录添加更准确的 isVisible 属性。
查找 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 视图。此视图包含以下列:

列	说明
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'

ShellTransition SQL 视图

过渡 proto 数据使用 ShellTransition 格式。

如需搜索过渡数据,请使用 transitions_search 视图。此视图包含以下列:

列	说明
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 视图。此视图包含以下列:

列	说明
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 格式。此视图包含以下列:

列	说明
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, '%');

运行查询

使用左侧面板时,系统会开始搜索跟踪记录。此过程需要几秒钟的时间。在开始时,时间轴不可用。

开始跟踪记录搜索后,在搜索框中输入查询,然后点击 Run Search Query 或按键盘上的 Enter 以运行该查询。

完成后,结果表格会显示在中间面板中。您的查询会显示在搜索框下方,并带有一个在会话之间保存查询的字段。

您可以通过点击左侧面板中的 Saved 标签页来访问已保存的查询,也可以通过点击 Recent 标签页来访问最近运行的查询:

搜索查看器左侧面板

图 2. 搜索查看器左侧面板。

结果

所有查询都会返回表格式结果,并在可滚动视图中显示,其交互行为类似于基于日志的跟踪记录查看器(例如 Transactions 和 ProtoLog):

搜索查看器结果

图 3. 搜索查看器结果。

如果生成的表格包含 ts 列,则该列中的值会被解释为时间戳,并作为新行条目添加到时间轴叠加层中。点击此行,然后使用向左和向右箭头键在条目之间导航:

搜索时间轴

图 4. 搜索时间轴。

<think>好的,我现在需要帮助用户了解Winscope的数据抓取方式、配置教程以及使用说明。首先,我需要回忆一下之前提供的引用内容。用户提到引用[1]是关于使用Winscope跟踪窗口转换的,而引用[2]指出生成跟踪记录的系统服务包括SurfaceFlinger、WindowManager、WMShell、IME、启动器等,并提到运行Winscope跟踪记录查看器。 接下来,我应该先整理Winscope的基本信息,比如它是什么,主要用途是什么。然后,根据引用中的系统服务,说明Winscope支持跟踪哪些组件。接下来,数据抓取的具体步骤可能需要分点说明,包括启用开发者选项、使用ADB命令、选择跟踪服务、开始记录和分析数据。同时,用户可能需要配置选项,比如调整采样率或过滤特定进程,这部分需要详细说明配置方法。 另外,用户可能遇到的问题比如权限不足或数据量过大,应该包含一些常见问题解答。最后,生成相关的问题,帮助用户进一步探索。需要确保回答结构清晰,步骤详细,并且正确引用提供的资料。还要注意使用中文,数学公式如果出现的话要用正确的LaTeX格式,不过这里可能不太涉及数学内容。检查是否有遗漏的步骤或配置细节,确保信息准确可靠。</think>### Winscope数据抓取与配置教程 WinscopeAndroid开源项目中用于分析窗口系统行为的工具,可捕获SurfaceFlinger、WindowManager等系统服务的运行数据[^1][^2]。 #### 一、数据抓取方式 1. **环境准备** - 设备需开启开发者模式,启用USB调试 - 安装ADB工具包(Android Debug Bridge) - 下载Winscope工具(包含在AOSP源码或预编译版本) 2. **基本抓取流程** ```bash # 连接设备 adb connect <device-ip> # 启动跟踪服务 adb shell cmd window tracing start # 执行需要分析的操作 # 停止跟踪 adb shell cmd window tracing stop # 导出数据 adb pull /data/misc/wmtrace/dump.winscope ``` 3. **支持的服务配置 - SurfaceFlinger(合成器) - WindowManager(窗口管理) - WMShell(多窗口支持) - IME(输入法) - 启动器(Launcher) #### 二、配置方法 1. **跟踪参数调整** - 修改采样频率:`adb shell settings put global window_trace_sampling_interval 10` - 设置缓冲区大小:`adb shell setprop debug.window.trace.buffer_size 50000` 2. **过滤规则设置** ```xml <!-- 在设备/etc/window_trace_filter.xml中配置 --> <filter> <process name="com.android.systemui"/> <layer name="NavigationBar"/> </filter> ``` #### 三、数据分析流程 1. 打开Winscope Viewer 2. 加载`dump.winscope`文件 3. 使用时间轴工具查看帧时序 4. 分析图层叠加关系(使用Layer Debug模式) 5. 检查窗口Z-order排列 #### 常见问题处理 - **权限不足**:检查SELinux策略`adb shell setenforce 0` - **数据不完整**:增大缓冲区或缩短采样间隔 - **无法解析**:确保Winscope版本Android版本匹配
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值