zoukankan      html  css  js  c++  java
  • 【Android端ANR卡顿检测】BlockCanary检测

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

  • 相关阅读:
    jboss:在standalone.xml中设置系统属性(system-properties)
    心得体悟帖---200608(机会都是自己创造的)
    心得体悟帖---200608(易中天评三国之刘备和诸葛亮关系启示:诚意真的重要)
    算法与数据结构---6.1、斐波那契数列-递推解法
    算法与数据结构---5、递推
    C++指针相关问题
    C++ new一个数组
    指针数组和数组指针的区别
    C++ new的用法
    webdings 和 wingdings 字体
  • 原文地址:https://www.cnblogs.com/keke-xiaoxiami/p/6963073.html
Copyright © 2011-2022 走看看