如何在Android Studio中使用LeakCanary检测内存泄露

发布网友 发布时间:2022-04-20 21:30

我来回答

1个回答

热心网友 时间:2023-06-24 01:37

内存泄露检测是项目性能优化不可避免的问题,只有解决内存泄露问题才能从根本上解决OOM。在Eclipse中提供Mat工具来检测内存泄露,但是使用较为麻烦,界面也不是很直观。对于有耐心,有想法的,也是可以尝试了解一下。知道Leak的出现,为内存泄露检测带来了福音。

1.什么是LeakCanary

LeakCanary

A memory leak detection library for Android and Java. 

LeakCanary是一个Android和Java的内存检测库。

2.LeakCanary如何展示内存泄露信息

如果项目存在内存泄露,就会在状态栏或是一个单独的Leaks程序中显示内存泄露信息,提供一个造成内存泄露对象的引用路径

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

3.LeakCanary的Github地址:

https://github.com/square/leakcanary

4.在Android Studio中使用LeakCanary

引入LeakCanary有多种方法,我们直接远程依赖
*   *Step 1:   配置bundle.gradle**

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'//    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

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

这是因为我们是远程依赖leakcanary,而leakcanary项目放在jcenter() 和mavenCentral()架包库中
所以需要在在build中再加入如下代码,并 clean Build。

allprojects {
repositories {
jcenter()
}
}    

如果仍不成功,需要添加

allprojects {
repositories {
jcenter()
mavenCentral()
}
}   

Step2:在Application文件中配置

public class ExampleApplication extends Application {

@Override public void 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);    // Normal app init code...
}

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

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

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

dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
}
2、使用compile 不再1区分debug 和 release12
dependencies {
compile 'com.squareup.leakcanary:leakcanary-android:1.5'

如果存在内存泄露,将会显示内存泄露的对象的引用路径。 

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com