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回收,保证检测的准确性