1. 什么是 Leak Canary ?
Leak Canary 是Square 家推出的开源的内存泄漏跟踪分析工具,项目的GitHub地址:https://github.com/square/leakcanary。话说 Square家的好东西可真不少,还有Retrofit OkHttp Picasso Dagger 这些好用的库。
2. 为什么要用 Leak Canary ?
在Leak Canary 发布之前,遇到内存泄漏的问题,只能依靠Eclipse 的MAT工具进行分析处理,那个分析难度啊,分析过的人都知道,一句话概括:费时费力。
Leak Canary发布之后,内存泄漏的检测简直太简单了,如何简单呢,请看下面Leak Canary的使用。
3. Leak Canary 的使用
第一步: 在项目工程的build.gradle里面加入应用编译:
compile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
这里要说明一下,项目打包如果分debug和release的话,这个引入要根据debug or release进行修改。我这里面是直接引入debug的。
第二步: 在应用的application 的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);
第三步 打包。 安装生成的apk,运行,第一次运行之后会生成Leaks 图标的内存泄漏检测工具。然后,运行app, 如果应用出现内存溢出,Leak Canary 就会弹出提示通知栏,并生成分析文件和日志显示,如下图
点击文字,会有详细一点的信息,如下图:
这个内存泄漏的信息如何理解呢,第一行的mContext 因为是静态变量,给它的赋值是赋值了Activity对象,而没有赋值给它Application 的值,导致当该Activity已经destory之后,java 的虚拟机要回收该Activity对象,但是因为mContext对象为static类型,它引用这该Activity对象,导致该Activity对象不能被回收,解决方法为给mContext赋值为Application的 Context。
是不是很简单,而且Leak Canary还可以把捕获的日志分享为文字或者堆日志文件。如下图所示:
4.使用心得
一. Leak Canary虽然好用,但是我们平常写代码还是要注意代码的写法,防止内存泄漏的发生。
二. 如果有些手机安装带有Leak Canary 的安装包之后能抓取内存泄漏的日志,但是不能分析,提示Leak Canary error,解决方法是换别的手机试试。