内存泄漏检测库:LeakCanary

QuibblerQuibbler 2020-01-27 约 6 分钟 1838 次阅读

内存泄漏检测库:LeakCanary

LeakCanary是Square公司基于MAT开源的一个工具,专门为Android开发的一个工具,用起来非常方便。。

Git地址:https://github.com/square/leakcanary

官方地址:https://square.github.io/leakcanary/

1、配置项目build.gradle

在build.gradle文件中添加依赖。注意有两个非常贴心,debugApi只在开发模式中包含功能代码,检测内存泄漏。releaseApi仅包含空方法,所以release版本不会影响用户的正常使用。

dependencies {
        debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'
    }

最新版本已经不用开发者手动初始化,自动集成到App中。

2、初始化LeakCanary(废弃)

自定义Application,在onCreate()中安装LeakCanary。别忘了在AndroidManifest.xml中将application节点替换成自己的Application。

@Override
    public void onCreate() {
        super.onCreate();
        LeakCanary.install(this);
    }

看到另有一种更严谨的安装方法:进行过滤操作,如果当前的进程是用来给LeakCanary进行堆分析的则返回,否则会执行LeakCanary的install()方法。

public void onCreate() {
        super.onCreate();
        if (LeakCanary.isInAnalyzerProcess(this)) {
            //此过程专用于LeakCanary进行堆分析。
            //在此过程中,您不应该初始化您的应用程序。
            return;
        }
        LeakCanary.install(this);
    }

安装好LeakCanary就可以为我们检测内存泄漏了,在运行过程中,如果APP发生内存泄漏就会提示并保存一些堆栈调用信息。方便我们追踪内存泄漏的源头。

3、借助RefWatcher分析内存泄漏

除了简单的安装LeakCanary,还可以通过RefWatcher对象来监控特定的Activity。得到RefWatcher,调用它的watch()方法,watch()方法的参数就是要监控的对象。发生内存泄漏的时候就会检测出并提示。

public class LeakApplication extends Application {
        private RefWatcher refWatcher;
        
        public void onCreate() {
            super.onCreate();
            refWatcher= setupLeakCanary();
        }
        
        /**
         *安装初始化LeakCanary,返回一个RefWatcher实例
         */
        private RefWatcher setupLeakCanary() {
            if (LeakCanary.isInAnalyzerProcess(this)) {
                return RefWatcher.DISABLED;
            }
            return LeakCanary.install(this);
        }
        
        /**
         *静态方法获得Application全局RefWatcher实例
         */
        public static RefWatcher getRefWatcher(Context context) {
            LeakApplication leakApplication = (LeakApplication) context.getApplicationContext();
            return leakApplication.refWatcher;
        }
        
    }

相关博客:

        《Android 源码系列之从源码的角度深入理解LeakCanary的内存泄露检测机制(上)》

        《Android 源码系列之从源码的角度深入理解LeakCanary的内存泄露检测机制(中)》

        《Android 源码系列之从源码的角度深入理解LeakCanary的内存泄露检测机制(下)》

        《LeakCanary流程介绍分析》

        《添加LeakCanary后编译冲突问题》

相关推荐

精选
Airbnb开源项目
开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

1.8k
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.2k
优美的开源动效库:Lottie
开源

优美的开源动效库:Lottie

优美的开源动效库:Lottie1、强大的动效LottieLottie是一个适用于Android,iOS,Web和Windows的库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并在移动设备和Web上原生渲染它们!GitHub:https://github.com/airbnb/lottie-androidLottie官网:http://airbn

4.3k