BlockCanary,LeakCanary原理

BlockCanary

简介
github地址,一款用来检测页面卡顿的非侵入式插件
使用

dependencies {
 // most often used way, enable notification to notify block event 
  compile 'com.github.markzhai:blockcanary-android:1.4.0' 
// this way you only enable BlockCanary in debug package
 // debugCompile 'com.github.markzhai:blockcanary-android:1.4.0'
 // releaseCompile 'com.github.markzhai:blockcanary-no-op:1.4.0'
}

然后在Application里

BlockCanary.install(this, new AppBlockCanaryContext()).start();

原理
前面有过一片写Handler的文章设计到Looper/Message/Handler的介绍,有一段代码

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

卡顿的原因都来自主线程的阻塞,而所有主线程的消息处理都会经历dispatchMessage,如果线程卡住就卡在上面的Log内而不执行dispatchMessage,而当消息处理完以后会打印处理完的Log,计算这两个Log的间隔就能知道卡顿时间
通过

Looper.getMainLooper().setMessageLogging(mainLooperPrinter);

设置一个我们自己的logPrinter,就可以监控消息,获取必要的信息进行分析,当时间间隔超出某个阈值的时候,我们就认为主线程卡住了,我们就dump这个信息,以备分析

LeakCanary

简介
首先附上github地址leakcanary from square,这是一款用来检测App内存泄露的插件,属于性能优化方面的插件吧
使用
1.首先在当前模块的gradle加入依赖

dependencies {
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' 
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' 
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' 
}

2.然后在我们的Application初始化的地方

public class ExampleApplication extends Application {
 @Override
 public void onCreate() {
 super.onCreate();
 if (LeakCanary.isInAnalyzerProcess(this)) {
 // This process is dedicated to LeakCanary for heap analysis.
 // You should not init your app in this process.
     return;
   }
 LeakCanary.install(this);
 // Normal app init code... 
  }
}

原理
1.这里牵涉到一个机制,当初始化弱,软引用的时候如果加入一个ReferenceQueue的话,当GC回收完引用对象的时候会把引用加到ReferenceQueue中
2.我们会维护一个 private final Set<String> retainedKeys用来保存没被GC回收的内存对象
3.监测的时机,因为Android是以Activity为单位 所以在onDestroy内开启检测,ActivityLifecycleCallback注册监听Activity的生命周期,由于gc不太靠谱,所以会有个5秒的延迟,进行检测,检测过程中还会主动调用gc回收,保证检测的准确性

    原文作者:Poseidon_Wang
    原文地址: https://www.jianshu.com/p/6ad46d961836
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞