前语

在Android项目中,有时候咱们需求去检测咱们的应用是否产生卡顿,而且需求知道卡顿的点在哪里,这样咱们才干去做优化。我上网查了很多材料,对比了好几种计划(如Matrix-TraceCanaryBlockCanaryBlockCanaryExArgusAPM),最后挑选运用Matrix-TraceCanary来做卡顿检测监控,这是由于其他几种计划,要么是卡顿检测的粒度太大,无法知道详细卡顿的点(函数)在哪里;要么是框架太老了,好久没人维护,无法兼容现在的项目。接下来介绍下Matrix-TraceCanary如何运用去定位到代码详细卡顿在哪个函数上。

Matrix-TraceCanary运用

1、在项目根目录下的 gradle.properties 中装备要依靠的 Matrix 版别号,我运用的是2.0.8版别如:

Android慢办法卡顿检测之Matrix TraceCanary的运用
2、在项目根目录下的 build.gradle 文件增加 Matrix 依靠,如:

Android慢办法卡顿检测之Matrix TraceCanary的运用
3、接着,在 app/build.gradle 文件中增加 Matrix TraceCanary模块的依靠(Matrix除了TraceCanary,还有好几个模块,由于咱们这儿只用来检测卡顿,所以只依靠TraceCanary就能够),如:

Android慢办法卡顿检测之Matrix TraceCanary的运用

Android慢办法卡顿检测之Matrix TraceCanary的运用
4、需求继承下DefaultPluginListener,这是用来接纳Matrix处理后的数据, 产生卡顿的相关数据便是在这个类回来给咱们的,如:

Android慢办法卡顿检测之Matrix TraceCanary的运用

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

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

5、实现动态装备接口MatrixDynamicConfigImpl:

Android慢办法卡顿检测之Matrix TraceCanary的运用

6、在咱们的Applicaiton做初始化装备:

Android慢办法卡顿检测之Matrix TraceCanary的运用

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

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

stack数据解读分析

首要咱们要知道,Matrix在编译时会生成一个methodMapping.txt文件,这个文件记录了咱们项目里一切办法的对应的id,咱们拿到上面的stack数据后,依据里边的数据来对照这张methodMapping表格,就能知道详细是哪个办法了。

Android慢办法卡顿检测之Matrix TraceCanary的运用

Android慢办法卡顿检测之Matrix TraceCanary的运用

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

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

这儿我把数据换行了下,方便我们阅读,能够看到这儿每一行都有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…