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

相关推荐
CYRUS_STUDIO2 小时前
Frida 检测与对抗实战:进程、maps、线程、符号全特征清除
android·逆向
csj503 小时前
安卓基础之《(28)—Service组件》
android
lhbian5 小时前
PHP、C++和C语言对比:哪个更适合你?
android·数据库·spring boot·mysql·kafka
catoop6 小时前
Android 最佳实践、分层架构与全流程解析(2025)
android
ZHANG13HAO7 小时前
Android 13 特权应用(Android Studio 开发)调用 AOSP 隐藏 API 完整教程
android·ide·android studio
田梓燊7 小时前
leetcode 142
android·java·leetcode
angerdream8 小时前
Android手把手编写儿童手机远程监控App之JAVA基础
android
菠萝地亚狂想曲8 小时前
Zephyr_01, environment
android·java·javascript
sTone873758 小时前
跨端框架通信机制全解析:从 URL Schema 到 JSI 到 Platform Channel
android·前端
sTone873758 小时前
Java 注解完全指南:从 "这是什么" 到 "自己写一个"
android·前端