一、什么是BlockCanary?
检测主线程卡顿的一个开源工具,基本展现模式等都和LeakCanary很像
二、BlockCanary的工作原理是什么?
工作原理所涉及到的底层的内容一定要理解清楚
这里是作者写的一个内容
下面这个是:讲解了一下ANR的一个检测原理,这个BlockCanary其实就是基于这个ANR检测逻辑的
其实就是:
Android中所有事件(包括Activity,Service生命周期管理)都是通过Looper+MessageQueue+Handler来处理的,然后在Looper的Loop方法,代码中有一段显示是这样的:
public static void loop() {
...
for (;;) {
...
// This must be in a local variable, in case a UI event sets the logger
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
...
}
}
所有事件都被封装成Message,然后被放入MessageQueue中,Looper负责将Message交给对应的Handler去处理。
Looper是一个死循环,通过dispatchMessage分发Message到对应Handler中处理。我们可以近似认为dispatchMessage花费的时间就是每条消息处理时间。因此,我们只要记录每个Mesage dispatchMessage的执行时间,就可以得到事件花费的时间。
从Looper源码中我们发现,执行dispatchMessage前后都有一个logging打印,并且Looper提供了注册logging的方法。所有我们可以在MainThread Looper中注册一个logging,在每条消息dispatchMessage前后,都能收到一条打印记录。通过记录dispatchMessage之前的时间t1和dispatchMessage执行之后的log时间t2,totalTime = t2-t1得到该事件执行时间。
三、如何使用
(1)在build.gradle的dependecies中添加对应的内容依赖:
dependencies{
compile'com.github.markzhai:blockcanary-android:1.5.0'
}
(2)在APP的APPlication的方法,在onCreate方法中添加install:
BlockCanary.install(this,new AppBlockCanaryContext()).start();
(3)注意(2)中,有一个AppBlockCanaryContext()的类,这个类需要自己去创建,具体如下:
这个类,就是extends BlockCanaryContext的类,这个BlockCanaryContext的类通过import com.github.moduth.blockcanary.BlockCanaryContext; 来实现
备注:这个BlockCanaryContext的类,主要是用来定义:Block多长时间可以报出,如下方法:
这里设置的就是1000ms,认为可以报出;一般如果刚开始的话,可以设置成2000ms
之后这些内容添加成功之后,进行apk的安装之后,就会生成一个辅助应用,名字叫Blocks
然后发现问题之后,会以通知栏形式报出,打开Blocks,就能看到卡顿的具体函数以及代码行数