MethodTraceMan
用于快速找到高耗时方法,定位解决 Android App 卡顿问题。通过 gradle plugin+ASM 实现可配置范围的方法插桩来统计所有方法的耗时,并在浏览器提供友好的界面展示,支持耗时筛选、线程筛选、方法名筛选等。
预览
整个项目包括三部分:
- 方法耗时数据收集部分:通过 gradle plugin+ASM 在编译时期对所有方法进行插桩收集方法耗时数据,并进行处理
- 方法耗时数据展示部分:在浏览器上展示方法耗时数据,并支持耗时筛选、线程筛选、方法名搜索等功能
- AndroidStduio 插件:用于方便在 AndroidStduio 顶部栏上快速打开方法耗时数据展示部分【即上面说的第二部分】
实现及原理
详见我的博客:App 流畅度优化:利用字节码插桩实现一个快速排查高耗时方法的工具
QuickStart
Step1 集成与配置
root project build.gradle
buildscript {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath "gradle.plugin.cn.cxzheng.methodTracePlugin:tracemanplugin:1.0.4"
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
maven { url "https://plugins.gradle.org/m2/" }
}
}
app module project build.gradle
dependencies {
debugImplementation 'com.github.zhengcx:MethodTraceMan:1.0.7'
releaseImplementation 'com.github.zhengcx:MethodTraceMan:1.0.5-noop'
}
apply plugin: "cn.cxzheng.asmtraceman"
traceMan {
open = true //这里如果设置为 false,则会关闭插桩
logTraceInfo = false //这里设置为 true 时可以在 log 日志里看到所有被插桩的类和方法
traceConfigFile = "${project.projectDir}/traceconfig.txt"
}
release 包下依赖的是 noop 包,里面不会做任何操作,也不会增加包大小。
在 app module 的根目录下创建一个名叫traceconfig.txt
的配置文件,并在里面对插桩范围进行配置
下面是配置示例:
#配置需插桩的包,如果为空,则默认所有文件都进行插桩(config the package need to trace,If they are empty, all files are traced by default.)
-tracepackage cn/cxzheng/asmtraceman
#在需插桩的包下设置无需插桩的包(Setting up traceless packages under packages that require trace)
#-keeppackage cn/cxzheng/asmtraceman/test
#在需插桩的包下设置无需插桩的类(Setting up traceless classes under packages that require trace)
#-keepclass cn/cxzheng/asmtraceman/MainActivity
#插桩代码所在类,这里固定配置为:cn/cxzheng/tracemanui/TraceMan(Fixed configuration here: cn/cxzheng/tracemanui/TraceMan)
-beatclass cn/cxzheng/tracemanui/TraceMan
注意: -tracepackage 后面是需要改成你自己项目中想配置插桩范围的包名,以斜杆分割如 cn/cxzheng/asmtraceman,错误示范:cn.cxzheng.asmtraceman
在 AndroidManifest.xml 中检查是否开启了网络权限,如果没有的话,请开启网络权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
最后,Rebuild 项目并运行安装你的 app,所有方法就会进行耗时插桩
Step2 安装 AndroidStduio 辅助插件: MethodTraceMan
这个插件的主要功能是可以在 AndroidStduio 上快速方便的打开 methodtraceman 的 UI 界面,这个插件已上传 AndroidStduio 的插件仓库,你可以通过在 AndroidStduio 插件库中搜索MethodTraceMan
来安装这个插件,当然在项目的 aspluin 目录下也提供了该插件的 jar 包,具体如何安装 AndroidStduio 插件,这里就不细说了,可以在网上搜索,安装好之后重启 AndroidStduio,就可以在顶部栏看到 MethodTraceMan 插件的黄色灯泡💡图标了,集成和安装到这里就介绍完毕了,下面我会介绍 MethodTraceMan 如何使用。
安装后重启,图如下:
注意: 如果重启 AndroidStduio 后在顶部栏没发现小灯泡图标,请检查 AndroidStduio 顶部栏 View->Toolbar 是否勾选上。
Step3 使用介绍
完成上面两步后,确保已完成:
- 按要求集成后,Rebuild&Run 启动你的 App
- AndroidStduio 上已安装好 MethodTraceMan 插件
接下来会介绍如何使用 MethodTraceMan 来方便的排查高耗时的方法:
1.将手机通过 Usb 连接电脑,确保连接成功。
2.启动 APP 后,此时点击 AndroidStduio 顶部栏的 MethodTraceMan 灯泡小图标,则会在浏览器上打开 MethodTraceMan 的 UI 界面如下:
3.点击“开始方法耗时统计按钮”,然后开始随意操作你的 app
4.操作完 app 后,点击“结束方法耗时统计”按钮,此时会输出所有方法的耗时统计,你可以进行耗时筛选、线程筛选、方法名搜索等进行筛查
问题排障
日志排障详见:问题排障
注意事项:
- 请不要同时打开两个集成了此项目的 App,会导致耗时数据无法传送到浏览器的 UI 界面
- 请不要同时连接两个手机,会导致浏览器打开界面失败
- 集成进自己的项目的话,请务必记得将 traceconfig.txt 中 -tracepackage 配置成自己想插桩的包范围
- 如果重启 AndroidStduio 后在顶部栏没发现小灯泡图标,请检查 AndroidStduio 顶部栏 View->Toolbar 是否勾选上
若升级 AndroidStduio4.x 后安装此 plugin 报错提示:Plugin is incompatible (supported only in IntelliJ IDEA).
解决方案:
1.cd 到 AndroidStduio 安装目录下的 plugins 文件夹下,如/Users/xxx/Library/ApplicationSupport/Google/AndroidStudio4.x/plugins
2.删除此文件夹下的 methodtraceman-plugin.jar
3.重启 AndroidStduio,重新安装此插件即可。
End 欢迎 Star/Fork/Issue.
集成及使用过程中有任何问题或者建议,欢迎与我进行交流,谢谢
License
Apache2.0.