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
}
}
那么AppWatcherInstaller
的onCreate
的方法是在何时调用的?其实就是ContentProvider
是在何时初始化的。它其实是在ActivityThread
的handleBindApplication
的方法中。
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);
…
}
通过上述代码可知,ContentProvider
的onCreate
方法要早于Application
的初始化,而LeakCanary
的初始化正是在ContentProvider
初始化时进行的,也就是说它帮助我们自动执行了初始化的过程。
需要注意的是,使用这种方式进行初始化的时候,不可以执行耗时代码,因为ContentProvider
的初始化也是在主线程进行了,否则就会导致app启动速度变慢。
LeakCanary检测原理
- LeakCanary进行内存泄漏检测主要是以下几个步骤:
-
获取可能泄漏的对象
-
生成
.hprof
文件 -
分析
.hprof
文件,并进行提示
- LeakCanary检测的对象
-
Act