Android内存泄漏分析及检测工具LeakCanary简介

本文介绍了LeakCanary的初始化过程,它在应用启动时自动执行初始化。LeakCanary通过获取可能泄漏的对象、生成文件并进行分析来检测内存泄漏,主要关注Activity、Fragment、ViewModel和Service。文章还探讨了单例导致的常见内存泄漏问题,并提供了Android开发资源链接。
摘要由CSDN通过智能技术生成
LeakCanary初始化

新版本2.x相比1.x的区别在于,不需要手动进行初始化了,只需要在主模块中的build.gradle中添加如下依赖,即可完成初始化。

debugImplementation ‘com.squareup.leakcanary:leakcanary-android:2.6’

那么新版本又是如何进行初始化的的呢?在源码中很容易发现找到AppWatcherInstaller这个类,因为ContentProvider在app启动时是在Application之前执行的,因而无需手动再在application类中执行初始化代码。

internal sealed class AppWatcherInstaller : ContentProvider() {

override fun onCreate(): Boolean {

val application = context!!.applicationContext as Application

AppWatcher.manualInstall(application)

return true

}

}

那么AppWatcherInstalleronCreate的方法是在何时调用的?其实就是ContentProvider是在何时初始化的。它其实是在ActivityThreadhandleBindApplication的方法中。

private void handleBindApplication(AppBindData data) {

// don’t bring up providers in restricted mode; they may depend on the

// app’s custom Application class

if (!data.restrictedBackupMode) {

if (!ArrayUtils.isEmpty(data.providers)) {

installContentProviders(app, data.providers);

}

}

// application 初始化

mInstrumentation.callApplicationOnCreate(app);

}

通过上述代码可知,ContentProvideronCreate方法要早于Application的初始化,而LeakCanary的初始化正是在ContentProvider初始化时进行的,也就是说它帮助我们自动执行了初始化的过程。

需要注意的是,使用这种方式进行初始化的时候,不可以执行耗时代码,因为ContentProvider的初始化也是在主线程进行了,否则就会导致app启动速度变慢。

LeakCanary检测原理
  • LeakCanary进行内存泄漏检测主要是以下几个步骤:
  1. 获取可能泄漏的对象

  2. 生成.hprof文件

  3. 分析.hprof文件,并进行提示

  • LeakCanary检测的对象
  1. Act

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值