# MethodTraceMan
用于快速找到高耗时方法,定位解决Android App卡顿问题。通过gradle plugin+ASM实现可配置范围的方法插桩来统计所有方法的耗时,并在浏览器提供友好的界面展示,支持耗时筛选、线程筛选、方法名筛选等。 ## 预览 ### 整个项目包括三部分: 1. 方法耗时数据收集部分:通过gradle plugin+ASM在编译时期对所有方法进行插桩收集方法耗时数据,并进行处理 2. 方法耗时数据展示部分:在浏览器上展示方法耗时数据,并支持耗时筛选、线程筛选、方法名搜索等功能 3. AndroidStduio插件:用于方便在AndroidStduio顶部栏上快速打开方法耗时数据展示部分【即上面说的第二部分】 ### 实现及原理 详见我的博客:[App流畅度优化:利用字节码插桩实现一个快速排查高耗时方法的工具](https://juejin.im/post/6844903975142047758) ## QuickStart ### Step1 集成与配置 #### root project `build.gradle` ```groovy 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` ```groovy 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`的配置文件,并在里面对插桩范围进行配置 下面是配置示例: ```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中检查是否开启了网络权限,如果没有的话,请开启网络权限 ```xml