Android 内存泄漏分析利器——leakcanary

2017-12-15  本文已影响380人  零宽度接合

leakcanary

一、简介

git地址(不用下载,使用gradle 引入便可):https://github.com/square/leakcanary

使用过程中发现,1.4,1.5, 1.6都会出现相应的OOMcrash无法获得相应的结果, 当前可正常使用的是1.3版本。(如果有相应问题的朋友建议使用1.3)

【错误提示】OutOfMemory Error thrown during Leak Analysis

这个项目是在应用相应的回退之后分析是否存在内存泄漏,如果存在内存泄漏,将进行相应的分析并处理,若没有则不会,不能做到MAT或者studio中相应的实时查看内存状态的,并且检测具有很大的延时,最少10s。

二、如何使用

测试demo可以采用官方的例子,地址为:https://github.com/square/leakcanary/tree/master/leakcanary-sample/src/main/java/com/example/leakcanary

具体操作如下:

step 1、配置build

在相应的build.gradle中加入如下代码

dependencies {

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'

releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'

}

【错误1:】截图如下:Failed to resolve: com.squareup.leakcanary:leakcanary-android

需要在在build中再加入如下代码,并clean Build。

[html]view plaincopy

allprojects {

repositories {

jcenter()

}

}

如果还是出现上述问题,那么替换为如下的代码:

allprojects {

repositories {

jcenter()

mavenCentral()

}

}

step 2、写入启动代码

在相应的application中加入(也可以在其他地方,但是传入install的context必须是application)

[java]view plaincopy

onCreate(){

super.onCreate();

LeakCanary.install(this);

}

step3、应用安装

安装应用,在debug版本的apk安装后,会出现如下两个图标:左边的是自己应用的图标,右边是启动应用后退出,自动安装的leakCancayDe图标。

【错误2】:但是有的人没有相应的图标,怎么办?

这个时候查看自己工程的库的引用,见下图:

因为gradle设置错误的原因,上述build分别设置了debugCompile 和 releaseCompile,具体的区别这里不细说了,需要有一定的gradle功底,才能改修完成。这里给出的最简易的方案,适用于该产品在加入的leakCancy仅仅在测试的时候使用,而在release包中手动去除相应的代码:【解决当前问题,但是不提倡】

1、debug 和 release 引用相同的lib

dependencies {

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'

releaseCompile 'com.squareup.leakcanary:leakcanary-android:1.3'

}

2、使用compile 不再1区分debug 和 release

dependencies {

compile 'com.squareup.leakcanary:leakcanary-android:1.3'

}

step4、检测内存泄漏

采用官方demo,点击相应的测试按钮,会启动一个AsyncTask,人为制造内存泄漏,之后back出去,等一段时间,看情况,一般会大于10s,有些会更长(不清楚具体的触发条件,什么时候开始检测,作者也没具体说明)如果是1.4以上,会有相应的一个启动提示,而1.3没有,这个时候可以看 studio中是否存在如下图的进程,并根据其相应的日志就才能知道是否启动了。

step5、如何知道检测到内存泄漏

一旦检测到内存泄漏,将会有相应的通知栏的提示(也就是说,如果你的应用不存在相应的泄漏,则不会提示)

step6、查看内存泄漏信息

点击通知栏图标或者点击应用icon都可以,可以得到如下的信息,根据这个信息就可以知道哪里出现了内存泄漏。

此外,还可以测试具体的Fragment,可以使用如下代码:

[java]view plaincopy

publicabstractclassBaseFragmentextendsFragment {

@OverridepublicvoidonDestroy() {

super.onDestroy();

RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());

refWatcher.watch(this);

}

}

这时候,application修改为:

[java]view plaincopy

publicclassExampleApplicationextendsApplication {

publicstaticRefWatcher getRefWatcher(Context context) {

ExampleApplication application = (ExampleApplication) context.getApplicationContext();

returnapplication.refWatcher;

}

privateRefWatcher refWatcher;

@OverridepublicvoidonCreate() {

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;

}

refWatcher = LeakCanary.install(this);

}

}

上一篇下一篇

猜你喜欢

热点阅读