Android慢方法卡顿检测之Matrix TraceCanary的使用

前言

在Android项目中,有时候我们需要去检测我们的应用是否发生卡顿,并且需要知道卡顿的点在哪里,这样我们才能去做优化。我上网查了好多资料,对比了好几种方案(如Matrix-TraceCanaryBlockCanaryBlockCanaryExArgusAPM),最后选择使用Matrix-TraceCanary来做卡顿检测监控,这是因为其他几种方案,要么是卡顿检测的粒度太大,无法知道具体卡顿的点(函数)在哪里;要么是框架太老了,很久没人维护,无法兼容现在的项目。接下来介绍下Matrix-TraceCanary如何使用去定位到代码具体卡顿在哪个函数上。

Matrix-TraceCanary使用

1、在项目根目录下的 gradle.properties 中配置要依赖的 Matrix 版本号,我使用的是2.0.8版本如:

2、在项目根目录下的 build.gradle 文件添加 Matrix 依赖,如:

3、接着,在 app/build.gradle 文件中添加 Matrix TraceCanary模块的依赖(Matrix除了TraceCanary,还有好几个模块,因为我们这里只用来检测卡顿,所以只依赖TraceCanary就可以),如:

4、需要继承下DefaultPluginListener,这是用来接收Matrix处理后的数据, 发生卡顿的相关数据就是在这个类返回给我们的,如:

如果检测到某个函数发生卡顿,这里就会被回调,具体的打印数据,类似如下,我们怎么通过这些数据来知道具体的卡顿点呢,这里有对这些数据的具体分析,TraceCanary的数据格式具体分析,现在我们先把TraceCanary跑起来先。

java 复制代码
**{  
    "machine":2015,  
    "detail":"ENTER",  
    "cost":3205,  
    "viewInfo":**{  
        "viewDeep":10,  
        "viewCount":6,  
        "activity":"TestFpsActivity"  
    },  
    "stack":"3,195,1,10\n1,33,1,58\n2,206,1,21\n3,161,1,16\n4,180,1,16\n5,169,1,16\n6,96,1,10\n7,98,1,10\n4,183,2,5\n5,211,6,0\n0,30,1,56\n",  
    "stackKey":"0,30,1,56\n",  
    "tag":"Trace_EvilMethod",  
    "process":"sample.tencent.matrix"  
}

5、实现动态配置接口MatrixDynamicConfigImpl:

6、在我们的Applicaiton做初始化配置:

至此,我们的项目就成功接入TraceCanary了,这时如果出现了某个函数发生卡顿(慢方法),我们就会收到相关的日志,如下,这里面的stack就是慢方法发生时的具体堆栈,只要我们把它解析出来,就能知道具体的卡顿点了。

java 复制代码
**{  
    "machine":2015,  
    "detail":"ENTER",  
    "cost":3205,  
    "viewInfo":**{  
        "viewDeep":10,  
        "viewCount":6,  
        "activity":"TestFpsActivity"  
    },  
    "stack":"3,195,1,10\n1,33,1,58\n2,206,1,21\n3,161,1,16\n4,180,1,16\n5,169,1,16\n6,96,1,10\n7,98,1,10\n4,183,2,5\n5,211,6,0\n0,30,1,56\n",  
    "stackKey":"0,30,1,56\n",  
    "tag":"Trace_EvilMethod",  
    "process":"sample.tencent.matrix"  
}

stack数据解读分析

首先我们要知道,Matrix在编译时会生成一个methodMapping.txt文件,这个文件记录了我们项目里所有方法的对应的id,我们拿到上面的stack数据后,根据里面的数据来对照这张methodMapping表格,就能知道具体是哪个方法了。

接下来讲下stack里的数据具体表示什么意思:

java 复制代码
**{  
    "stack":"
    3,195,1,10\n
    1,33,1,58\n
    2,206,1,21\n
    3,161,1,16\n
    4,180,1,16\n
    5,169,1,16\n
    6,96,1,10\n
    7,98,1,10\n
    4,183,2,5\n
    5,211,6,0\n
    0,30,1,56\n", 
}

这里我把数据换行了下,方便大家阅读,可以看到这里每一行都有4个数据如"3,195,1,10""1,33,1,58""2,206,1,21"

第一个数字代表:该方法在堆栈里的层级。

第二个数字代表:该方法在methodMapping表格的id。

第三个数字代表:该方法被调用的次数。

第四个数字代表:该方法具体的耗时。

但是这里都有个很麻烦的点就是,我们在日志里拿到stack数据后,我们需要去打开methodMapping表,然后再一一去对应找相关的函数,这就比较麻烦,这里有一篇文章有比较快捷的方式,可以参考下: Matrix-TraceCanary 实际使用

TraceCanary的原理

网上介绍该原理的文章有很多,这里推荐几篇:

github.com/Tencent/mat...

blog.yorek.xyz/android/3rd...

developer.aliyun.com/article/103...

相关推荐
太空漫步112 小时前
android社畜模拟器
android
海绵宝宝_5 小时前
【HarmonyOS NEXT】获取正式应用签名证书的签名信息
android·前端·华为·harmonyos·鸿蒙·鸿蒙应用开发
凯文的内存7 小时前
android 定制mtp连接外设的设备名称
android·media·mtp·mtpserver
天若子7 小时前
Android今日头条的屏幕适配方案
android
林的快手8 小时前
伪类选择器
android·前端·css·chrome·ajax·html·json
望佑9 小时前
Tmp detached view should be removed from RecyclerView before it can be recycled
android
xvch11 小时前
Kotlin 2.1.0 入门教程(二十四)泛型、泛型约束、绝对非空类型、下划线运算符
android·kotlin
人民的石头15 小时前
Android系统开发 给system/app传包报错
android
yujunlong391915 小时前
android,flutter 混合开发,通信,传参
android·flutter·混合开发·enginegroup
rkmhr_sef15 小时前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb