LeakCanary - 内存泄露检测

之前说了 Fabric ,这次就来说说内存使用这个东西吧.

前言

千里之堤,溃于蚁穴 - 韩非《韩非子·喻老》 都能用,就这样吧

因为开源的特性, Android 拥有着各种各样不同尺寸屏幕和硬件配置的设备.
顶级到 5-6 寸 Snapdragon 821/Exynos 8890 + 6GB 的旗舰机型

Oneplus 3T
目测到新机型出来为止还是要靠抢的 4T

Samsung Galaxy S7 Edge
在 BOOM7 宣布回收后独立支撑的 S7E

低端到充几百块电话费就能送的联发科/瑞芯微 + 1GB / 512MB 的运营商定制手机

LT999
移动定制机,放狗搜了下这货貌似还用的 YunOS

种类繁多的设备决定你在开始开发应用时就要想好要不要考虑使用低端设备的用户,这使得你要在系统版本,动画效果,依赖的使用等方面有所取舍,毕竟在低版本低配置的设备上做兼容会增加一部分代码和工作量.

如果你选择了兼容的道路,那就要在优化上面下点功夫了(当然写任何程序都应当在优化上面下功夫).

在代码方面只能靠深入学习来慢慢优化,但在内存泄漏上, SquareLeakCanary 拯救了 Android 开发者于水火之中,只需把它丢进你的依赖列表里面,然后再写上两三行代码, LeakCanary 就能自动检测内存泄漏并在发现泄露时通知开发者.

安装和使用

先在 LeakCanaryGithub 上查看最新的版本,毕竟在理论上来说新的总比旧的好.

导入依赖

Module 级别的 build.gradle 中添加依赖并同步

build.gradle

1
2
3
4
5
6
7
8
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
...
}

使用

在你的 Application 类中初始化 LeakCanary

Application.class

1
2
3
4
5
6
7
8
@Override
public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
}

如果你有使用Fragment,那么要多写几行

Application.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class YooooEXApplication extends Application {

private RefWatcher refWatcher;

public static RefWatcher getWatcher(Context context) {
YooooEXApplication application = (YooooEXApplication) context.getApplicationContext();
return application.refWatcher;
}

@Override
public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
refWatcher = LeakCanary.install(this);
}

}

YourFragment.class

1
2
3
4
5
6
@Override
public void onDestroy() {
super.onDestroy();
RefWatcher refWatcher = YooooEXApplication.getWatcher(getActivity());
refWatcher.watch(this);
}

到这里 LeakCanary 就已经配置完成了,当你使用的 Build Variant 中 Debuggable 为 true 时, LeakCanary 在发现内存泄漏时会弹出通知提示你它发现你露出了,并会给出泄露源头.

memory leaks
妈蛋我漏了