发布网友 发布时间: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'
}
如果存在内存泄露,将会显示内存泄露的对象的引用路径。