LeakCanary 工作原理

712 阅读1分钟

LeakCanary的安装

LeakCanary 提供了一个名为 LeakSentryInstallerContentProvider

ContentProvider 的安装

ContentProvider 的安装流程是在 APP 启动过程中完成的,这里回顾一下:
Zygote 收到 AMS 的请求创建出一个APP进程之后,会调用到 ActivityThread.main() 方法,这里主要有三件事:

  1. 创建 ActivityThread() 对象
  2. 创建 ApplicationThread() 对象
    final ApplicationThread mAppThread = new ApplicationThread();
  3. 调用 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 检测内存泄漏原理

核心流程
调用流程