LeakCanary 是 Square 开源的一款 Android 内存泄漏检测工具,开发时非常常用,可以帮助我们快速发现 Activity、Fragment、View、单例、Handler 等导致的内存泄漏问题。下面我给你一个系统性的使用说明:
1. 引入依赖
在 app/build.gradle
添加(最新版本可以到 LeakCanary GitHub 查看):
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.14'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.14'
}
-
debugImplementation
:只在 debug 包中启用检测 -
releaseImplementation
:release 版本用 no-op,避免性能开销
2. 自动初始化
LeakCanary 在 Android 10+,以及大多数场景下会 自动初始化,不需要手动配置。安装好依赖后,直接运行 Debug 包即可。
默认情况下,LeakCanary 会自动监控以下对象是否被正确回收:
-
Activity
-
Fragment
-
View
-
Service
3. 运行效果
-
启动 App 后,如果有对象无法释放,LeakCanary 会在通知栏弹出提示。
-
点击通知 → 打开 LeakCanary 内置界面 → 展示泄漏对象的 引用链。
引用链会告诉你:
哪个对象持有了泄漏对象的引用,直到导致无法回收。
4. 常用手动检测方式
有时需要手动检测对象是否泄漏,可以用 AppWatcher.objectWatcher.expectWeaklyReachable()
。
AppWatcher.objectWatcher.expectWeaklyReachable(
someObject,
"描述信息:比如某个Activity/单例可能泄漏"
)
这样即使对象不是 Activity/Fragment 这种默认监控的,LeakCanary 也能帮你检测。
5. 常见泄漏场景
LeakCanary 能检测到的典型问题:
-
Handler / Runnable 持有 Activity 引用(未移除消息队列)。
-
静态变量 / 单例 持有 Context / Activity。
-
注册未注销(比如 BroadcastReceiver、EventBus)。
-
匿名内部类、非静态内部类 持有外部类引用。
-
WebView 在 Activity 销毁后未释放。
6. 使用建议
-
只在 Debug 版本启用,避免影响性能和用户体验。
-
定期运行,尤其是大功能开发完成后。
-
关注引用链最后的持有者,很多时候泄漏是因为某个全局对象忘了解除引用。