LeakCanary使用总结
I. 使用
build.gradle中配置:
1 | |
Application class中配置:
1 | |
II. 初始化与原理
根据build.gradle配置:
debug包走:com.squareup.leakcanary:leakcanary-android:1.3
release包走: com.squareup.leakcanary:leakcanary-android-no-op:1.3
分别解析
release
release包,LeakCanary.install(this)就是返回了一个RefWatcher#DISABLED,而RefWatcher#DISABLE中返回的都是空方法。
debug包
1 | |
- 如果是
HeapAnalyzerService的进程(非app主的进程),返回一个DISABLED。否则创建一个Android默认配置的RefWatcher - 创建一个
Application#ActivityLifecycleCallbacks,并且注册到当前Application上(由于该Api是在api 14才有的,因此低版本没有注册),主要是为了,在所有的Activity#onDestroy执行的最后通过调用RefWatcher#watch(Object)来检测Activity是否出现了泄漏。
RefWatcher#watch(Object o)基本原理
- 先促发一次GC
- 如果
o依然存在,dump heap到本地 - dump完成后启动
HeapAnalyzerService服务(如果不存在)(单独进程) - 在
HeapAnalyzerService中读取本地dump下来的文件,使用HAHA库进行分析。 - 如果检测到内存泄漏,将结果返回给
DisplayLeakService服务,并且显示通知
III. 定位检测情况
推荐log关键字
1 | |
下面是几个案例
1 | |



IV. 注意点
- release千万不要带上(带no-op包),由于GC耗时,因此会带来:安装包增加、应用onDestory由于gc带来耗时、由于新建的分析进程带来内存开销,由于大量的计算分析,带来的CPU资源的占用。
- Android api 14以下的
LeakCanary#install(Application):RefWatcher是不会自动注册对Activity的检测的,需要自己实现BaseActivity并且在Activity#onDestroy的地方主动调用RefWatcher#watch(Object)进行检测 - 检测是比较慢的,其中涉及i/o,涉及大量的计算分析,通常在20s~1分钟左右,根当前cpu资源占用情况有关。
LeakCanary使用总结
https://blog.dreamtobe.cn/2015/05/18/LeakCanary使用总结/