一、什么是BlockCanary?

检测主线程卡顿的一个开源工具,基本展现模式等都和LeakCanary很像

二、BlockCanary的工作原理是什么?

工作原理所涉及到的底层的内容一定要理解清楚

http://blog.zhaiyifan.cn/2016/01/16/BlockCanaryTransparentPerformanceMonitor/

这里是作者写的一个内容

下面这个是:讲解了一下ANR的一个检测原理,这个BlockCanary其实就是基于这个ANR检测逻辑的

http://blog.csdn.net/bazhongren/article/details/51125113

其实就是:

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);

}

...

}

}

来自 <http://blog.zhaiyifan.cn/2016/01/16/BlockCanaryTransparentPerformanceMonitor/>

所有事件都被封装成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得到该事件执行时间。

来自 <http://blog.csdn.net/bazhongren/article/details/51125113>

三、如何使用

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

更多相关文章

  1. 有没有方法在不root手机的情况下读取Data目录下的文件
  2. Android中横竖屏切换时,onConfigurationChanged方法不被调用
  3. android中保存一个ArrayList到SharedPreferences的方法
  4. Android中Broadcast Receiver的两种注册方法和区别
  5. E/JavaBinder:FAILED BINDER TRANSACTION错误解决+RadioGroup调用
  6. 制作动态表格(最好的方法)
  7. Android开发笔记——改变字体颜色的三种方法
  8. Android 自定义控件高度设置onMeasure方法
  9. Android开发一些实用的类、方法及接口(新手向)

随机推荐

  1. Android沉浸式状态栏、导航栏
  2. android 中使文本(TextView 、button等可
  3. android 支付宝SDK集成
  4. Android 无法查看外部依赖jar的源码的问
  5. android 自定义SeekBar
  6. 百度地图 android 相关收集
  7. Android:GestureDetector手势识别类
  8. )Android之getSystemService
  9. Android软件汉化/精简/去广告/优化教程
  10. android获取图片的RGB颜色值