【前言】
所谓的内存泄露,大多数情况下,都是跟android那些有生命周期的对象有关,比如:
- 在后退栈backstack中添加了一个Fragment,但是这个Fragment并没有在
Fragment.onDestroyView()方法中清空它的view字段;(见
StackOverflow answer)
- 把activity上下文保存为一个对象的字段,以便在因为配置改变(横竖屏切换之类)而发生activity重建时还能获取到这个对象;
- 在代码中注册了监听listener、广播接收者broadcast receiver或者RxJava订阅,这些都依赖着有生命周期的对象,但是在有生命周期的对象在onDestroy时,却忘记注销之前注册过的那些对象
那么,怎样方便快速地定位找出这些导致内存泄露的代码呢?LeakCanary就是内存泄露检测的神器
【LeakCanary 2.0+使用方法】
截止到发文,目前LeakCanary最新版本是:2.2
1)在项目的build.gradle中添加以下依赖:
dependencies {
// debugImplementation because LeakCanary should only run in debug builds.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2'
}
2)然后,编译打包运行,就可以看到成功的日志打印:
D LeakCanary: Installing AppWatcher
3)注意,从2.0+开始,你不需要添加任何代码,即可检测activity与fragment的是否发生内存泄露,假如你需要检测其他对象是否发生内存泄露,在监测对象本该已经销毁的地方(比如:onDestroy)添加下面代码,就可以检测你需要监测的对象是否正常销毁
AppWatcher.INSTANCE.getObjectWatcher().watch(mPresenter,"观察presebter是否正常销毁");
4)要是运行的apk有内存泄露的话,你会看到弹出一个小鸟的弹窗,等个5秒钟,去桌面打开:
这个icon在安装好你的apk,就会显示在桌面了
5)然后,你就可以看到内存泄露的具体信息:
【备注】
假如你使用的是2.0之前的旧版本,那么参照这个升级说明文档升级吧~