Kotlin Android LeakCanary内存泄漏检测实战

在Kotlin Android应用中使用LeakCanary检测内存泄漏的步骤如下:

1. 添加依赖

在模块的build.gradle文件中添加LeakCanary依赖:

kotlin 复制代码
dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12' // 使用最新版本
}

2. 自动初始化(无需额外代码)

LeakCanary 2.x及以上版本会自动初始化,无需手动配置。确保应用启动时加载了Application类即可。

3. 制造内存泄漏(测试)

创建存在内存泄漏的Activity:

kotlin 复制代码
class LeakyActivity : AppCompatActivity() {
    companion object {
        var leakedContext: Context? = null // 静态引用导致泄漏
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        leakedContext = this // 错误:静态变量持有Activity实例
    }
}

4. 触发检测

运行应用,进入LeakyActivity后退出。LeakCanary会自动检测泄漏,并在通知栏提示。

5. 分析报告

点击通知查看泄漏轨迹,报告会显示泄漏对象的引用链。例如:

复制代码
┬───
│ GC Root: System class
│
├─ LeakyActivity class
│    Leaking: NO (a class is never leaking)
│    ↓ static LeakyActivity.leakedContext
│                         ~~~~~~~~~~~~~~
╰→ LeakyActivity instance
     Leaking: YES (ObjectWatcher was watching this)

报告指出leakedContext静态变量导致泄漏。

6. 修复泄漏

onDestroy中清除引用:

kotlin 复制代码
override fun onDestroy() {
    super.onDestroy()
    leakedContext = null // 释放引用
}

7. 自定义配置(可选)

在自定义Application类中调整LeakCanary:

kotlin 复制代码
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        LeakCanary.config = LeakCanary.config.copy(
            retainedVisibleThreshold = 3, // 触发堆转储前保留的可见实例数
            referenceMatchers = listOf(
                IgnoredReferenceMatcher(
                    pattern = "com.example.IgnoredClass" // 忽略特定类
                )
            )
        )
    }
}

8. 高级场景

  • Fragment监测:LeakCanary默认支持Fragment销毁后的泄漏检测。

  • 自定义对象监控 :手动观察对象:

    kotlin 复制代码
    val watchedObject = SomeObject()
    LeakCanary.watch(
        watchedObject,
        description = "SomeObject should be garbage collected"
    )

9. 注意事项

  • 性能影响 :仅在debug构建中使用,避免影响生产环境性能。
  • 及时处理泄漏:修复报告中优先级高的泄漏,避免累积问题。
  • 持续集成 :可通过LeakCanary的JUnit规则在自动化测试中检测泄漏。

10. 常见泄漏场景及修复

  • 静态Context引用 :改用ApplicationContext或弱引用。
  • 未注销监听器 :在生命周期结束时注销(如onDestroy)。
  • Handler/Runnable延迟任务 :使用WeakReferenceView.postDelayed并清理回调。

通过以上步骤,可有效利用LeakCanary识别和修复内存泄漏,提升应用稳定性和性能。

相关推荐
CodeCraft Studio1 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
零点零一1 小时前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助
开发语言·qt
android_xc2 小时前
Android Studio国内仓库配置
android·ide·android studio
FunnySaltyFish2 小时前
Kotlin 2.2.20 上新:新contract、跨平台编译稳定、默认Swift导出……
kotlin
alexhilton2 小时前
runBlocking实践:哪里该使用,哪里不该用
android·kotlin·android jetpack
2501_915106323 小时前
iOS 使用记录和能耗监控实战,如何查看电池电量消耗、App 使用时长与性能数据(uni-app 开发调试必备指南)
android·ios·小程序·uni-app·cocoa·iphone·webview
雨白3 小时前
深入解析 Android 多点触摸:从原理到实战
android
lingchen19064 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
gb42152874 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go4 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript