LeakCanary检测内存泄漏.md

一使用步骤

  1. 添加依赖
// 内存泄漏检测
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
  1. 在application中注册.后面有代码
  2. 运行项目后会出现图标以下,若是有泄漏会以列表的形式进行展示;

二注意事项

  1. 因为咱们这个项目是有多个moudle,一开始是LeakCanary是配置在commonlib项目下的,项目的application也是在commonlib下applicationLib里写入的,这样发现不行,后来将项目环境切成每一个moudle单独运行,这时我全部配置项都在marketbundle这个里面配置了,这时发现是能够进行内存检测了;
# 是不是module环境file://
IS_MODULE=false

  1. 总结教训:一开始因为配置所有是在commomlib下面的,我app下面的application去继承commomlib的applicationlib,applicationlib写了Leakcanary的注册这时发现是不行的,安装app后并无黄色的Leaks图标出现,而我本身试验本身的appDemo是彻底能够的,这个时候其实我就应该意识到这个内存泄漏注册应该是在主app的moudle里面进行,而我走了不少的弯路,最后一步一步排除过来才完成了配置,总而言之注意2点
  • 在gradle里面配置的依赖和application必须是在同一个moudle下,并必定是主moudle;(多个modle状况下,一个的话就不存在这种状况)
  • 必须在当前application里面实现注册代码
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;
    }
}
相关文章
相关标签/搜索