概述
RheaTrace (以下简称 btrace ) 是字节跳动技术团队旗下开源的一款性能分析追踪工具,截止到笔者今日写该文时间 2021年12月22日,项目开源推送到 GitHub 仅仅 2 日,虽然开源仅 2 日,但是根据从字节的 Android 研发同学获悉到,字节内部已经有多款 APP 正在使用。下文列出 GitHub 和和介绍文章。
实现
根据 介绍文章 以及进行初步的接入体验,用一句话来概括 :btrace 是以 Android Systace 为基石通过对 systrace 进行二次开发、封装(含 systrace 命令封装),结合了 Android 字节码插桩技术、Gradle 插件、Python 等多样性的技术结合推出的性能分析工具,并且 btrace 在文件的 IO 写出效率以及 output 输出的 trace 文件可视化做了很大的努力。
当然项目使用的语言很多,受限于个人的认知可能没有概括完全的地方。
反编译查看全量插桩:
我将演示的工程进行了反编译,通过下图我们可以看出 btrace 确实对方法进行了全量插桩
Systace
对于 Btrace ,Systrace 是关键。
Systrace的原理:它的思想很朴素,在系统的一些关键链路(比如System Service,虚拟机,Binder驱动)插入一些信息(我这里称之为Label),通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息,进而得到整个系统的运行性能信息。Android Framework里面一些重要的模块都插入了Label信息(Java层的通过android.os.Trace类完成,native层通过ATrace宏完成),用户App中可以添加自定义的Label,这样就组成了一个完成的性能分析系统。
使用案例:
使用
(直接以 btrace 工程为例) 省略 gradle 以及 Python 脚本配置,如果在自己的工程中使用请配置上述两项
环境准备
Python 2.7
配置完毕后可通过终端执行 Python 查下 Python 版本
systrace 环境变量配置
配置到 ~/.bash_profile
export PATH=${PATH}:/Users/macbook/Library/Android/sdk/platform-tools/systrace
配置完毕后可执行 source ./~bash_profile 立即生效,如果该项配置有问题。执行后续 systrace 命令时会报
验证配置
工程根路径下 /scripts/python/rheatrace 执行:
获取输出文件
Run 起来工程以后执行:
python rheatrace.py -a rhea.sample.android -t 5 -o ./output/mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
将产生的 HTML 文件通过 ui.perfetto.dev/ 去打开。
查到对应进程进行图表查看(查询命令如上)
样例编写分析
我尝试改造演示 demo 在 FirstFragment#onViewCreated()加入一个 3000 的主线程休眠,我们重新生成 trace 文件,再来查看主进程:
清晰能查看到成功抓取到了这 3000ms 耗时
以上只是基础用法,btrace 以及 systrace 还有大量的命令以及如何对图表进行分析才是排查问题的关键。
不足
线上
从 btrace 了解到,目前不支持线上生成环境使用和开启 btrace,全量插桩带来的性能损耗在 10% 以下
本地环境依赖
需要依赖本地环境 ,例如 python systrace
环境支持
目前仅支持 Mac 环境
不足解决
btrace 在 GitHub 上提到有计划将目前存在的不足之处在后续的版本迭代中持续解决。
支持
目前 btrace 的技术支持可以通过 QQ群以及到 GitHub 上提交 issue ,回复都相当快。
- Communicate on GitHub issues.
- Study the source code.
- Check wiki or FAQ for help.
- Contact us kisson_cjw@hotmail.com.
- Join QQ group chat.