一、什么是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,就能看到卡顿的具体函数以及代码行数