LeakCanary 内存泄漏检测工具高级使用指南
概述
LeakCanary 是 Android 平台上著名的内存泄漏检测工具,由 Square 公司开发。它能够帮助开发者快速发现应用中的内存泄漏问题。本文将深入介绍 LeakCanary 的高级配置和使用方法,帮助开发者根据项目需求进行定制化配置。
核心功能定制
监控自定义生命周期对象
LeakCanary 默认会监控 Activity、Fragment、Fragment View 和 ViewModel 实例。但应用中可能还有其他具有生命周期的对象需要监控:
class MyService : Service {
override fun onDestroy() {
super.onDestroy()
AppWatcher.objectWatcher.watch(
watchedObject = this,
description = "MyService 已收到 onDestroy() 回调"
)
}
}
配置选项详解
LeakCanary 的配置分为两部分:
- 对象监控配置 (AppWatcher.config)
- 堆转储与分析配置 (LeakCanary.config)
建议在 debug 版本的 Application 类中进行配置:
class DebugApp : Application() {
override fun onCreate() {
super.onCreate()
// 不监控 Fragment 视图
AppWatcher.config = AppWatcher.config.copy(watchFragmentViews = false)
// 设置可见对象保留阈值
LeakCanary.config = LeakCanary.config.copy(retainedVisibleThreshold = 3)
}
}
高级使用场景
在发布版本中统计保留实例
虽然不建议在发布版本中使用完整功能,但可以仅使用对象监控部分:
dependencies {
implementation 'com.squareup.leakcanary:leakcanary-object-watcher-android:版本号'
}
然后通过以下方式获取保留实例数量:
val retainedInstanceCount = AppWatcher.objectWatcher.retainedObjectCount
Android TV 适配
在 Android TV 设备上使用时需注意:
- TV 设备没有通知系统,LeakCanary 会改用 Toast 提示
- 手动触发堆转储需将应用置于后台
- API 26+ 设备上可能需通过 adb 命令查看泄漏列表
自定义图标和标签
可以替换默认的泄漏展示图标和标签:
res/
mipmap-*/leak_canary_icon.png
values/strings.xml
<string name="leak_canary_display_activity_label">自定义泄漏标签</string>
特殊场景处理
处理已知库泄漏
对于第三方库已知的内存泄漏问题:
LeakCanary.config = LeakCanary.config.copy(
referenceMatchers = AndroidReferenceMatchers.appDefaults +
AndroidReferenceMatchers.staticFieldLeak(
className = "com.example.SomeSingleton",
fieldName = "sContext",
description = "单例中的静态字段泄漏了 Context"
)
)
忽略特定类
对于某些第三方组件的已知泄漏问题:
// 方法1:添加为已知库泄漏
// 方法2:禁用自动监控,手动监控目标对象
AppWatcher.config = AppWatcher.config.copy(watchActivities = false)
对象标记与识别
可以为特定对象添加识别标签:
val inspector = ObjectInspector { reporter ->
reporter.whenInstanceOf("com.example.DbEntity") { instance ->
val id = instance["com.example.DbEntity", "id"]!!.value.asInt!!
labels += "DbEntity.id = $id"
}
}
性能优化
独立进程分析
将分析过程移至独立进程可减少对主进程的影响:
debugImplementation 'com.squareup.leakcanary:leakcanary-android-process:版本号'
产品风味配置
为不同构建类型配置 LeakCanary:
android {
flavorDimensions "default"
productFlavors {
dev {
// 开发环境配置
}
}
}
configurations {
devDebugImplementation {}
}
dependencies {
devDebugImplementation "com.squareup.leakcanary:leakcanary-android:版本号"
}
高级分析功能
堆转储元数据提取
添加自定义元数据到分析报告:
LeakCanary.config = LeakCanary.config.copy(
metadataExtractor = { graph ->
mapOf("自定义键" to "自定义值") + AndroidMetadataExtractor.extractMetadata(graph)
}
)
混淆处理
对于使用混淆的应用,需添加反混淆插件:
buildscript {
dependencies {
classpath 'com.squareup.leakcanary:leakcanary-deobfuscation-gradle-plugin:版本号'
}
}
apply plugin: 'com.squareup.leakcanary.deobfuscation'
leakCanary {
filterObfuscatedVariants { variant ->
variant.name == "debug"
}
}
JVM 应用支持
LeakCanary 也可用于普通 JVM 应用:
// 配置堆转储
object HeapDumper {
fun dumpHeap(fileName: String) {
// 实现堆转储逻辑
}
}
// 配置分析器
class JvmHeapAnalyzer : OnObjectRetainedListener {
override fun onObjectRetained() {
// 实现分析逻辑
}
}
总结
LeakCanary 提供了丰富的配置选项和扩展点,开发者可以根据项目需求进行深度定制。通过合理配置,可以在不影响应用性能的前提下,高效地发现和解决内存泄漏问题。建议根据项目实际情况,选择最适合的配置方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



