- 使用体验:支持 Windows 啦!此外将脚本实现从 Python 切至 Java 并去除各种权限要求,因脚本工具可用性问题引起的用户使用打断次数几乎降为 0,同时还将 Trace 产物切至 PB 协议,产物体积减小 70%,网页打开速度提升 7 倍!
- 性能体验:通过大规模改造方法 Trace 逻辑,将 App 方法 Trace 底层结构由字符串切换为整数,实现内存占用减少 80%,存储改为 mmap 方式、优化无锁队列逻辑、提供精准插桩策略等,百万量级方法全插桩下性能损耗进一步降低至 15%!
- 监控数据:新增 4 项数据监控能力,重磅推出渲染详情采集能力!同时还新增 Binder、线程启动、Wait/Notify/Park/Unpark 等详情数据!
在您项目的根目录下build.gradle文件中增加 rhea-gradle-plugin 作为依赖。
buildscript {
dependencies {
classpath 'com.bytedance.btrace:rhea-gradle-plugin:2.0.3-rc02'
}
}
接着,在app/build.gradle文件中应用如下所示插件和依赖。
dependencies {
// rheatrace core lib
implementation "com.bytedance.btrace:rhea-core:2.0.3-rc02"
}
...
apply plugin: 'com.bytedance.rhea-trace'
...
rheaTrace {
compilation {
traceFilterFilePath = "${project.rootDir}/trace-filter/traceFilter.txt"
needPackageWithMethodMap = true
applyMethodMappingFilePath = ""
}
}
RheaTrace 2.0 简化编译插件参数,仅需要提供 compilation 配置用于控制编译期行为。RheaTrace 1.0 中 runtime 配置已废弃,但为保证兼容升级,我们还是保留 runtime 参数配置,即使配置也不会生效,RheaTrace 2.0 改为通过脚本命令行参数来动态配置,后文将详细介绍。
参数 | 默认值 | 说明 |
---|---|---|
traceFilterFilePath | null | 该文件配置决定哪些方法需要被插桩,详细用法与 RheaTrace 1.0 一致,可以参考 RheaTrace Gradle 参数介绍。 |
applyMethodMappingFilePath | null | 设备方法的 ID,您可以通过指定上次编译输出的 methodMapping.txt 文件路径来保证多次编译的方法 ID 一致。 |
needPackageWithMethodMap | true | 是否将 methodMapping.txt 文件打包内置到 apk 内部。 |
- 确保电脑已集成 adb 与 Java 环境。
- 连接手机至电脑,并保证可被 adb devices 识别。
- 安装集成 RheaTrace 2.0 的 APK 至手机。
- 下载下方“脚本管理” 最新脚本至电脑。
- 在电脑脚本所在目录执行如下命令。
java -jar rhea-trace-shell.jar -a ${your app package name} -t 10 -o output.pb -r rhea.all sched -fullClassName
- trace 产物使用 https://ui.perfetto.dev/ 即可打开分析。
版本号 | 发布日期 | 脚本 | 更新说明 |
---|---|---|---|
2.0.0 | 2023-06-24 | rhea-trace-shell-2.0.0.jar | 2.0 首次发布 |
RheaTrace 2.0 在命令行参数上做了大量改进,更偏于开发者使用。
参数 | 默认值 | 说明 |
---|---|---|
-a $applicationName | N/A | 指定您的 App 的包名 |
参数 | 默认值 | 说明 |
---|---|---|
-o $outputPath | 当前时间.pb | 指定产物 trace 保存路径,默认值会根据时间戳自动生成 |
-t $timeInSecond | 5 | 指定这次采集的时长,单位是秒 |
-mode $mode | 根据设备而定 | 指定采集 Trace 的模式,目前支持两种模式:
|
-maxAppTraceBufferSize $size | 500000000 | 采集 Trace 时的 buffer 大小,单位是字节,一般而言,您不需要配置此参数,除非您遇到下面类似的提醒:MaxAppTraceBufferSize is too small. Expected 100515704 Actual 100000000. Add -maxAppTraceBufferSize 100515704 to your command注意:maxAppTraceBufferSize 仅在 App 启动后的首次 trace 时生效 |
-threshold $ns | 0 | 采集函数耗时阈值,单位纳秒。采集时长较长时该参数可减小产物体积 |
-s $serial | 指定 adb 连接的设备 | |
-mainThreadOnly | 仅采集主线程 trace | |
-r | 自动重启以抓取启动过程的 trace | |
-fullClassName | trace 信息默认是不包含包名的,此参数可开启包名 | |
-deeplink $deeplink | 指定 deeplink 链接 | |
rhea.binder | 开启 binder 信息增强 | |
rhea.render | 开启渲染监控能力 | |
rhea.io | 开启 IO 监控能力 | |
rhea.thread | 开启线程创建监控能力 | |
rhea.block | 开启 park/unpark/wait/notify 监控功能 | |
rhea.all | 开启上述所有 RheaTrace 增强的监控能力 | |
-debug | 打印调试日志 | |
--list | 查看设备支持的 category 列表 |
如果您对 RheaTrace 2.0 实现原理感兴趣,可以查看文档:btrace 2.0 技术方案简介。如果有其他疑问,欢迎加入底部的飞书群进行探讨。
问题 | 建议 | |
---|---|---|
1 | 部分定制 ROM 可能遇到 Perfetto 采集失败的情况,错误提示如下: Error: systrace file not found:rheatrace.workspace/systemTrace.trace |
|
2 | 不支持 Perfetto 的设备(主要是8.1以前的系统)上无法采集到 CPU 调度等系统信息。 | 建议使用 -mode simple 模式。 |
3 | 32 位 apk 容易遇到虚拟内存不足的错误导致崩溃 |
|
4 | methodMapping 内置到 apk 内部需要将 mergeAssets 依赖于 dexBuilder,如果您的工程也有反向依赖,则会导致循环依赖问题 | 1. 通过配置 needPackageWithMethodMap = false,可以将内置 methodMapping 功能关闭,这样可以解决循环依赖的问题,但是在使用 btrace 功能时需要手动通过 -m 提供 methodMapping 路径。 |
RheaTrace 2.0 在错误提示上也做了大量的优化,使用中遇到问题建议先通过提示信息尝试解决。当然,也会有一些边界的 case 我们没有做到准确的提示,或者提示的信息不够清晰,欢迎加入下面的btrace 飞书群
进行反馈,我们将定期处理。也欢迎大家提供其他的反馈与建议!