LeakCanary
com.squareup.square:leakcanary-android
是 Square 公司开源的 Android 内存泄漏检测库。它能够自动检测并报告应用中的内存泄漏,极大地简化了 Android 开发中的内存泄漏排查过程。
LeakCanary 的工作原理主要分为四个步骤 :
-
检测保留对象 (Detecting retained objects): LeakCanary 通过 Hook Android 生命周期方法 (例如 Activity 的
onDestroy()
和 Fragment 的onDestroyView()
) 来监控 Activity、Fragment、View 和 ViewModel 等对象的销毁。它使用弱引用 (WeakReference
) 来跟踪这些对象。如果在等待一段时间(默认 5 秒)并执行垃圾回收后,弱引用仍然指向这些已销毁的对象,则表明这些对象被保留了,可能存在内存泄漏 。 LeakCanary 会将这些信息记录到 Logcat 中,并在达到一定阈值(默认应用可见时为 5 个,不可见时为 1 个)时显示通知 。 -
转储堆 (Dumping the heap): 当保留对象的计数达到阈值时,LeakCanary 会将 Java 堆转储到一个
.hprof
文件中 。这个过程会短暂冻结应用。 -
分析堆 (Analyzing the heap): LeakCanary 使用 Shark 库来分析
.hprof
文件,找到保留对象并确定导致这些对象无法被垃圾回收的引用链(泄漏追踪)。 -
分类泄漏 (Categorizing leaks): LeakCanary 将检测到的泄漏分为两类:应用泄漏 (Application Leaks) 和库泄漏 (Library Leaks) 。应用泄漏是由应用自身代码引起的,而库泄漏是由第三方库中的 bug 引起的。LeakCanary 会在报告中区分这两类泄漏,方便开发者排查。
LeakCanary 的优势在于其自动化和易用性。开发者无需手动进行内存分析,LeakCanary 会自动检测、报告并提供详细的泄漏追踪信息,帮助开发者快速定位和修复内存泄漏问题 。 它还会对泄漏进行分组,相同的泄漏只显示一个追踪,减少冗余信息。 LeakCanary 还提供了一个可视化的界面来查看泄漏详情 ,并能区分应用自身代码导致的泄漏和第三方库导致的泄漏。