您的位置:首页 > 移动开发 > Android开发

Android内存泄漏分析及实践(三)-leakCanary

2016-03-17 16:52 453 查看

Android内存泄漏分析及实践(三)-leakCanary

android应用程序本身系统分配的内存很少,一旦发生泄漏,程序很快就会变得非常卡顿,直至OOM崩溃。程序猿需要在Coding的时候注意静态变量的使用,以及注册监听器记得反注册,否则当程序出现内存泄露之后再去分析就变得相当困难。通过code review很难发现深层次的内存泄露问题。

当内存泄露真的出现了,我们可以借助工具去分析。常见的内存泄露分析工具有MAT和LeakCanary。

MAT和LeakCanary区别

MAT是一个非常出色的内存分析工具,但是使用非常麻烦,它是分析指定进程所有的对象,工具本身并不知道到底哪些对象出现了内存泄露,需要使用者(程序猿)分析得出。好处是不会有代码侵入性。

leakCanary是一个开源软件,在github地址为https://github.com/square/leakcanary。该工具包含debug和release两个版本。debug版本可以将泄露对象显示在DisplayLeakActivity中,而release不会展示,可以将泄露信息传送到指定服务器。要使用该工具,我们工程需要依赖leakCanary aar,并且需要修改我们的应用程序。LaekCanary只能监听Activity和Fragment内存泄露。

LeakCanary使用介绍

步骤1: 修改 build.gradle,使工程依赖leakCanary:

dependencies {
compile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
compile 'com.squareup.leakcanary:leakcanary-watcher:1.3.1'
}


步骤2: 修改自定义Application,注册leakCanary:

public class ExampleApplication extends Application {
private static RefWatcher refWatcher;
@Override public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
public static RefWatcher getRefWatcher() {
return refWatcher;
}
}


通过以上两步,leakCanary就能自动检测程序中所有Activity是否发生内存泄露。当检测到内存泄露,会通过通知栏通知用户,可以在DisplayLeakActivity中查看泄露信息,包括泄露对象,泄露内存大小,以及引用树。通过以上步骤我们仅仅能检测Activity,为了检测Fragment,我们需要创建一个父类BaseFragment extends Fragment,然后所有Fragment继承BaseFragment。

步骤3: 修改BaseFragment,检测fragment内存泄露

public class BaseFragment extends Fragment{
@Override
public void onDestroy() {
super.onDestroy();
RefWatcher refWatcher = DriverApplication.getRefWatcher();
refWatcher.watch(this);
}
}


通过以上三个步骤,leakCanary就可以自动检测Activity和Fragment了。最后附上一张内存泄露分析结果图片:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: