2026-10-20 09:00:21
LeakCanary 是一个用于检测 Android 应用程序内存泄漏的库,其核心原理是通过弱引用监控对象回收状态,结合堆转储分析定位泄漏路径,最终生成报告通知开发者。 以下是其工作原理的详细说明:
1. 安装与初始化每个被监控对象会被包装为 KeyedWeakReference,关联唯一 UUID 键值。
弱引用特性允许对象在无强引用时被 GC 回收,同时通过 ReferenceQueue 监听回收状态。
若目标对象的 KeyedWeakReference 出现在队列中,说明对象已被正常回收。
若未出现,则进入泄漏确认流程。
通过 Debug.dumpHprofData() 请求系统生成 .hprof 文件,记录当前堆内存快照。
文件默认存储在应用缓存目录(如 /data/data/<package>/files/leakcanary/),大小可能达数十 MB。
从泄漏对象(如未释放的 Activity)出发,逆向追踪强引用链。
识别关键持有节点(如静态集合、未关闭的 Cursor、非静态内部类等)。
泄漏对象类型及数量。
完整引用链(如 MainActivity@123456 → StaticField → Singleton@789012)。
代码位置建议(基于堆栈信息定位可能泄漏的代码行)。
Android 系统通知栏显示摘要信息。
生成 HTML 或文本格式的详细报告,存储于设备并可通过 Logcat 或文件管理器查看。
集成到 CI/CD 流程(如通过 LeakCanary.config 设置拦截构建)。
LeakCanary 通过上述流程实现了从检测到定位的全自动化,显著降低了 Android 内存泄漏的排查成本,是开发阶段性能优化的重要工具。