内存泄漏检测库:LeakCanary

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

内存泄漏检测库: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

2.3k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175
sherpa解析:开源语音技术全家桶
精选开源

sherpa解析:开源语音技术全家桶

想在手机、树莓派甚至 RISC-V 开发板上离线跑语音识别,五年前还是个需要啃 Kaldi 源码的硬核课题。k2-fsa 组织的 sherpa 把这件事变成了"下载预训练模型、装个包、跑示例"的三步操作。这个以 Apache-2.0 协议开源的项目自我定位是"新一代 Kaldi 的语音转文本框架",它专注端到端模型的推理部署:transducer 与 CTC 两类架构,C++ 与 Python 双…

44