跟踪窗口转换

WinScope 可帮助您跟踪窗口转换,并提供了用于在转换期间和转换后记录和分析窗口管理器状态和 Surface Flinger 状态的基础架构和工具。WinScope 将所有相关的系统服务状态记录在一个跟踪文件中,您可以使用该文件重现并逐步查看转换。

记录跟踪情况

您可以在运行 userdebug 或 eng 版本的设备上通过快捷设置或 ADB 记录跟踪情况。

通过快捷设置

  1. 启用开发者选项
  2. 依次转到开发者选项 -> 快捷设置开发者图块
  3. 启用 Winscope 跟踪
  4. 打开快捷设置
  5. 点按 Winscope 跟踪以启用跟踪
  6. 在设备上执行窗口转换
  7. 窗口转换完成后,请打开快捷设置,然后点按 Winscope 跟踪以停用跟踪

跟踪记录会被写入 /data/misc/wmtrace/wm_trace.pb/data/misc/wmtrace/layers_trace.pb,同时还会包含在所有错误报告中。

通过 ADB

窗口管理器跟踪记录

  1. 启用跟踪
    adb shell cmd window tracing start
  2. 停用跟踪
    adb shell cmd window tracing stop
  3. 抓取跟踪文件
    adb pull /data/misc/wmtrace/wm_trace.pb wm_trace.pb

Surface Flinger 跟踪记录

  1. 启用跟踪
    adb shell su root service call SurfaceFlinger 1025 i32 1
  2. 停用跟踪
    adb shell su root service call SurfaceFlinger 1025 i32 0
  3. 抓取跟踪文件
    adb pull /data/misc/wmtrace/layers_trace.pb layers_trace.pb

生成状态转储文件

WinScope 可以从错误报告读取窗口管理器和 Surface Flinger 当前状态的快照。错误报告将状态信息以单独的 Proto 文件的形式存储在 proto 文件夹中。要使用 ADB 生成状态转储文件,请运行以下命令。

窗口管理器

adb exec-out dumpsys window --proto > window_dump.pb

Surface Flinger

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.pb

分析跟踪记录

要分析跟踪文件,请使用 WinScope 网络应用。您可以在源代码的基础上编译此应用,也可以从预编译目录中打开此应用。

  1. 从 Android 源代码代码库中下载预编译的软件工件
    curl 'https://android.googlesource.com/platform/prebuilts/misc/+/master/common/winscope/winscope.html?format=TEXT' | base64 -d > winscope.html
  2. 在网络浏览器打开已下载的软件工件
  3. 打开 WinScope 后,点击打开文件以加载跟踪文件

使用 WinScope

在 WinScope 中打开跟踪文件后,您便可以通过多种方式对该文件进行分析。

WinScope 屏幕截图

时间轴

您可以使用箭头键或点击各个条目以浏览时间轴。

屏幕

您可以在屏幕上直观地查看每个可见窗口。点击屏幕上的某个窗口即可选择层次结构中相应的源窗口。

层次结构

您可以通过层次结构查看系统已知的每个窗口。有些窗口不包含缓冲区,它们存在的目的在于为其子项设置政策。可见窗口均标有 V 图标。

属性

您可以在属性中查看在层次结构中所选条目的状态信息。

开发 WinScope

您启用跟踪后,窗口管理器和 Surface Flinger 会记录每个兴趣点的当前状态,并将状态信息保存在文件中。frameworks/base/core/proto/android/server/windowmanagertrace.protoframeworks/native/services/surfaceflinger/layerproto/layerstrace.proto 包含其内部状态的 Proto 定义。

检查代码和设置环境

  1. 安装 Yarn(一个 JS 软件包管理器)
  2. 下载 Android 源代码
  3. 前往 development/tools/winscope
  4. 运行
    yarn install

编译和测试更改

  1. 前往 development/tools/winscope
  2. 运行
    yarn run dev