内存泄漏工具LeakCanary使用

一使用步骤

在项目中我们经常遇到内存泄漏,但是我们应该怎样去捕捉他,as自带工具是一种,还有一种就第三方控件;

  1. 添加依赖

    1
    2
    3
    // 内存泄漏检测
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
  2. 在application中注册.后面有代码

  3. 运行项目后会出现图标如下,如果有泄漏会以列表的形式进行展现;

二注意事项

  1. 由于我们这个项目是有多个moudle,一开始是LeakCanary是配置在commonlib项目下的,项目的application也是在commonlib下applicationLib里写入的,这样发现不行,后来将项目环境切成每个moudle单独运行,这时我所有配置项都在marketbundle这个里面配置了,这时发现是可以进行内存检测了;
    1
    2
    # 是否是module环境
    IS_MODULE=false

  1. 总结教训:一开始由于配置全部是在commomlib下面的,我app下面的application去继承commomlib的applicationlib,applicationlib写了Leakcanary的注册这时发现是不行的,安装app后并没有黄色的Leaks图标出现,而我自己试验自己的appDemo是完全可以的,这个时候其实我就应该意识到这个内存泄漏注册应该是在主app的moudle里面进行,而我走了很多的弯路,最后一步一步排除过来才完成了配置,总而言之注意2点
  • 在gradle里面配置的依赖和application必须是在同一个moudle下,并一定是主moudle;(多个modle情况下,一个的话就不存在这种情况)
  • 必须在当前application里面实现注册代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class HostApplication extends ApplicationLib {
    //
    private String TAG = HostApplication.class.getSimpleName();
    public RefWatcher refWatcher;
    @Override
    public void onCreate() { //必须在这个方法里面进行创建和注册,不要在lib里面写一个abstract方法这里面继承,不能这样
    Log.i(TAG, "onCreate");
    super.onCreate();
    refWatcher = setupLeakCanary();
    }
    private RefWatcher setupLeakCanary() {
    JLog.i(TAG, "LeakCanary setupLeakCanary");
    //如果当前的进程是用来给LeakCanary 进行堆分析的则return,否则会执行LeakCanary的install方法。这样我们就可以使用LeakCanary了,如果检测到某个Activity 有内存泄露,LeakCanary 就会给出提示。
    if (LeakCanary.isInAnalyzerProcess(this)) {
    JLog.i(TAG, "LeakCanary isInAnalyzerProcess");
    return RefWatcher.DISABLED;
    }
    return LeakCanary.install(this);
    }
    public static RefWatcher getRefWatcher(Context context) {
    HostApplication leakApplication = (HostApplication) context.getApplicationContext();
    return leakApplication.refWatcher;
    }
    }

尝试过的策略

  1. 在app里面的gradle配置和在其application里面进行配置 ok
  2. 在publicbundle里面gradle配置,public的application里面写监听,然后app里面的application再继承 失败
  3. 在publicbundle里面gradle配置,public的application里面写监听,然后app里面的application重新也写一遍,失败
  4. 在publicbundle里面进行gradle配置,然后app 里面的application进行配置,按道理是应该成功的,聚饰项目也是 失败