LeakCanary的安装
LeakCanary 提供了一个名为 LeakSentryInstaller 的 ContentProvider
ContentProvider 的安装
ContentProvider 的安装流程是在 APP 启动过程中完成的,这里回顾一下:
Zygote 收到 AMS 的请求创建出一个APP进程之后,会调用到 ActivityThread.main() 方法,这里主要有三件事:
- 创建
ActivityThread()对象 - 创建
ApplicationThread()对象
final ApplicationThread mAppThread = new ApplicationThread(); - 调用
ActivityThread.attach;
ActivityThread.attach 经过一系列调用会到 ApplicationThread.bindApplication 方法中,然后会发送一条 sendMessage(H.BIND_APPLICATION, data); 的 handler 消息,收到消息后,在 handleBindApplication 方法里,
分别调用了 installContentProviders (安装 ContentProvider) 和 mInstrumentation.callApplicationOnCreate(app);(app 的 onCreate方法),到此 App 已经启动。 如下图:
installContentProviders 调用流程
LeakCanary 原理
LeakCanary
LeakCanary 对 activity 的检测是通过 registerActivityLifecycleCallbacks 实现的
发起内存泄漏检测的代码
RefWatcher核心原理
RefWatcher内湖维护了两个集合,在watch调用之后,首先将对象的弱引用添加到集合 watchedReferences 中,延时五秒之后,从队列中获取,如果队列中能查找到引用,说明对象已经被回收,这时将引用对象移动到 retainedReferences 中,暂时标记为泄漏
LeakCanary 检测内存泄漏原理
核心流程
调用流程