本篇文章制作相关的三个 trace 东西:
- Skia Debugger:检查运用 N 帧制作的 Skia 指令,但看不了详细耗时,一般用于排查 制作作用相关问题
- Perfetto:总览 N 秒内体系内的进程的制作仓库,但无法得知详细的制作指令
- AGI(Android GPU Inspector):具备体系 trace 和更详细的烘托指令检查,支撑 vulkan 和 opengl,但运用体会不太好,成功率很低。
如需运行 skia debugger 需求编译
libhwui.so
参阅 AOSP 编译与调试运行指南 下载环境下一期介绍 【以暗影为例剖析 skia 指令】 和 【
libhwui.so
的两种 debug 方法】
-
Skia Debugger
作用:检查运用 N 帧制作的 Skia 指令,但看不了详细耗时
作用:
- 逐帧检查 app 的制作状况:
- 检查某一帧对应的制作进程和指令,可用于优化不必要的制作操作:
制作指令的解析敬请期待下一期【以暗影为例剖析 skia 指令】
用法:
-
编译一个敞开 skia debug 的 libhwui.so
在源码的 frameworks/base/libs/hwui/Properties.cpp
文件中,将 Properties::debuggingEnabled
属性改为 true
编译 libhwui.so
,在源码根目录下:
source build/envsetup.sh
lunch sdk_phone_x86_64
make libhwui -j16
产品在 out/target/product/emulator64_x86_64/system/lib64/libhwui.so
下生成
-
将敞开 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
-
发动脚本,指定要抓取的程序包名和帧数
留意,履行脚本之前必须确认已 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 触发帧刷新
这个时候随意交互一下,触发 app 的画面更新,比及 5 帧更新之后。
假如 app 帧刷新了但是这儿仍是没有改变,检查一下是否 root
在脚本的履行文件夹下就会生成对应的 trace 文件,后缀是 skp
或者 mskp
,之后经过 debugger.skia.org/ 检查即可:
例如,下面这一帧就经过了 425 个制作指令完结
点击可检查某个制作指令详细的参数和制作作用
如图,咱们在开发进程中运用的 ImageView,最终是经过下面的 DrawImageRect
指令完结制作
主张翻开右边的两个选项,便利检查当前制作指令的作用范围和 clip 区域
详细的制作指令可参数能够参阅 Doc :
-
Perfetto
作用:总览 N 秒内体系内的进程的制作状况,但无法检查详细的制作指令
作用:
- 检查 App 多个线程的仓库,常用于功能剖析:
用法:
能够直接经过 GUI 的方式帧,翻开 ui.perfetto.dev/,进入 new trace,配置需求 trace 的信息,点击 start recording 即可。
不过这种方式我经常提示 adb 衔接错误,所以一般复制下面的指令直接履行:
抓取成功会提示文件方位:
[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 ./
-
AGI(Android GPU Inspector)
作用:具备体系 trace 和制作指令检查,而且一起支撑 vulkan 和 opengl,但运用体会不太好,成功率很低。
作用:
- 体系 trace 检查
- 帧制作指令抓取(成功率很低,而且不直观)
用法:
-
软件下载,支撑 Mac/Windows/Linux
两个进口,左面的对应 Perfetto,右边的类似 Skia debugger
-
System trace
留意挑选 trace 的时间,和输出文件的地址,然后点击 start
根本和 Perfetto 一样,不过感觉 Perfetto 的运用体会比这个好
-
帧制作指令抓取
首先挑选抓取的类型 Vulkan 或者 OpenGL,假如是 GL 模式还需求在手机上安装一个运用 :
agi-angle.storage.googleapis.com/index.html
详细流程参阅官方文档,不过这个东西运用成功率很低,不是很推荐
developer.android.com/agi/start#f…
vulkan:
developer.android.com/ndk/guides/…
成功的一次指令如下,能够抓到详细的 gl 指令: