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...

相关推荐
深海呐1 小时前
Android AlertDialog圆角背景不生效的问题
android
ljl_jiaLiang1 小时前
android10 系统定制:增加应用使用数据埋点,应用使用时长统计
android·系统定制
花花鱼1 小时前
android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
android
落落落sss2 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
消失的旧时光-19434 小时前
kotlin的密封类
android·开发语言·kotlin
服装学院的IT男5 小时前
【Android 13源码分析】WindowContainer窗口层级-4-Layer树
android
CCTV果冻爽7 小时前
Android 源码集成可卸载 APP
android
码农明明7 小时前
Android源码分析:从源头分析View事件的传递
android·操作系统·源码阅读
秋月霜风8 小时前
mariadb主从配置步骤
android·adb·mariadb
Python私教8 小时前
Python ORM 框架 SQLModel 快速入门教程
android·java·python