前语
在Android项目中,有时候咱们需求去检测咱们的应用是否产生卡顿,而且需求知道卡顿的点在哪里,这样咱们才干去做优化。我上网查了很多材料,对比了好几种计划(如Matrix-TraceCanary
、BlockCanary
、BlockCanaryEx
、ArgusAPM
),最后挑选运用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
跑起来先。
**{
"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
:
6、在咱们的Applicaiton
做初始化装备:
至此,咱们的项目就成功接入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
表格,就能知道详细是哪个办法了。
接下来讲下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的原理
网上介绍该原理的文章有很多,这儿引荐几篇: