本篇文章制作相关的三个 trace 东西:

  • Skia Debugger:检查运用 N 帧制作的 Skia 指令,但看不了详细耗时,一般用于排查 制作作用相关问题
  • Perfetto:总览 N 秒内体系内的进程的制作仓库,但无法得知详细的制作指令
  • AGI(Android GPU Inspector):具备体系 trace 和更详细的烘托指令检查,支撑 vulkan 和 opengl,但运用体会不太好,成功率很低。

如需运行 skia debugger 需求编译 libhwui.so 参阅 AOSP 编译与调试运行指南 下载环境

下一期介绍 【以暗影为例剖析 skia 指令】 和 【libhwui.so 的两种 debug 方法】

  1. Skia Debugger

作用:检查运用 N 帧制作的 Skia 指令,但看不了详细耗时

作用:

  • 逐帧检查 app 的制作状况:

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

  • 检查某一帧对应的制作进程和指令,可用于优化不必要的制作操作:

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

制作指令的解析敬请期待下一期【以暗影为例剖析 skia 指令】

用法:

  1. 编译一个敞开 skia debug 的 libhwui.so

在源码的 frameworks/base/libs/hwui/Properties.cpp 文件中,将 Properties::debuggingEnabled 属性改为 true

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

编译 libhwui.so,在源码根目录下:

source build/envsetup.sh
lunch sdk_phone_x86_64
make libhwui -j16

产品在 out/target/product/emulator64_x86_64/system/lib64/libhwui.so 下生成


  1. 将敞开 debug 的 libhwui.so 推到 /system/lib64 下

adb push out/target/product/emulator64_x86_64/system/lib64/libhwui.so /system/lib64/
// 然后重启
adb reboot

需求留意,这儿 push 的路径是 /system/lib64,需求匹配对应的体系架构。假如 push 到 /system/lib 会导致机器不能发动, 因为编译的产品是 64 位,而 /system/lib 寄存的 32 位。解决办法也很简单,将 out/target/product/emulator64_x86_64/system/lib 下的 libhwui.so push 到 /system/lib 下即可启机。

一起这一步需求 Root 和挂载 /system 目录,不然文件会 push 失败

adb: error: failed to copy 'out/target/product/emulator64_x86_64/system/lib64/libhwui.so' to '/system/lib64/libhwui.so': remote couldn't create file: Read-only file system

我一般按照下面进程履行:

adb disable-verity && adb root && adb shell mount -o rw,remount /system
// 之后重启
adb reboot
// 机器发动之后再一次
adb disable-verity && adb root && adb shell mount -o rw,remount /system

然后按照上面的步骤从头 push libhwui.so


  1. 发动脚本,指定要抓取的程序包名和帧数

留意,履行脚本之前必须确认已 root ,不然可能呈现脚本一向卡住,可履行两次指令:

adb disable-verity && adb root && adb shell mount -o rw,remount /system

脚本如下:

android.googlesource.com/platform/fr…

例如:我要抓取飞书 com.ss.android.lark 的 5 帧,指令如下

./skp-capture.sh com.ss.android.lark 5

第一次履行可能会提示需求重启进程,杀掉进程重启即可:

./skp-capture.sh com.ss.android.lark 5
./skp-capture.sh: 33: 10: not found
debug.hwui.capture_skp_enabled was found to be disabled, enabling it now.
 restart the process you want to capture on the device, then retry this script.

脚本成功如图,等待 app 触发帧刷新

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

这个时候随意交互一下,触发 app 的画面更新,比及 5 帧更新之后。

假如 app 帧刷新了但是这儿仍是没有改变,检查一下是否 root

在脚本的履行文件夹下就会生成对应的 trace 文件,后缀是 skp 或者 mskp,之后经过 debugger.skia.org/ 检查即可:

例如,下面这一帧就经过了 425 个制作指令完结

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

点击可检查某个制作指令详细的参数和制作作用

如图,咱们在开发进程中运用的 ImageView,最终是经过下面的 DrawImageRect 指令完结制作

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

主张翻开右边的两个选项,便利检查当前制作指令的作用范围和 clip 区域

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

详细的制作指令可参数能够参阅 Doc :

api.skia.org/


  1. Perfetto

作用:总览 N 秒内体系内的进程的制作状况,但无法检查详细的制作指令

作用:

  • 检查 App 多个线程的仓库,常用于功能剖析:

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

用法:

能够直接经过 GUI 的方式帧,翻开 ui.perfetto.dev/,进入 new trace,配置需求 trace 的信息,点击 start recording 即可。

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全
检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全
检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

不过这种方式我经常提示 adb 衔接错误,所以一般复制下面的指令直接履行:

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

抓取成功会提示文件方位:

[731.953]     perfetto_cmd.cc:999 Connected to the Perfetto traced service, TTL: 5s
[737.127]    perfetto_cmd.cc:1127 Wrote 36690892 bytes into / data /misc/perfetto -traces /trace

把文件 pull 出来之后经过上面的网站翻开即可

(base) ➜  trace adb pull /data/misc/perfetto-traces/trace ./

  1. AGI(Android GPU Inspector)

作用:具备体系 trace 和制作指令检查,而且一起支撑 vulkan 和 opengl,但运用体会不太好,成功率很低。

作用:

  • 体系 trace 检查

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

  • 帧制作指令抓取(成功率很低,而且不直观)

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

用法:

  1. 软件下载,支撑 Mac/Windows/Linux

github.com/google/agi/…

两个进口,左面的对应 Perfetto,右边的类似 Skia debugger

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

  1. System trace

留意挑选 trace 的时间,和输出文件的地址,然后点击 start

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全
检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

根本和 Perfetto 一样,不过感觉 Perfetto 的运用体会比这个好

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全

  1. 帧制作指令抓取

首先挑选抓取的类型 Vulkan 或者 OpenGL,假如是 GL 模式还需求在手机上安装一个运用 :

agi-angle.storage.googleapis.com/index.html

详细流程参阅官方文档,不过这个东西运用成功率很低,不是很推荐

developer.android.com/agi/start#f…

vulkan:

developer.android.com/ndk/guides/…

成功的一次指令如下,能够抓到详细的 gl 指令:

检查恣意运用的 Skia 制作指令 - 安卓烘托调试东西大全