尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
LeakCanary Android 内存泄漏检测库快速入门:一行依赖完成集成与验证
LeakCanary Android 内存泄漏检测库快速入门一行依赖完成集成与验证【免费下载链接】leakcanaryA memory leak detection library for Android.项目地址: https://gitcode.com/gh_mirrors/le/leakcanaryLeakCanary 是 Square 开源的 Android 内存泄漏检测库本文以 docs/getting_started.md 为核心带你走完从添加依赖、自动初始化到 Logcat 验证的全过程。读完本文你将掌握 LeakCanary 的最小接入方式、其零代码背后自动检测的五大对象类型以及如何结合本仓库源码确认集成是否生效为后续学习泄漏分析与修复打下基础。前置条件在开始集成之前请确保你的项目满足以下条件项目使用 Gradle 构建并在模块级build.gradle或build.gradle.kts中声明了依赖项目为 Android 应用模块application而非纯 library 模块——LeakCanary 需要监听应用生命周期并在应用进程中运行你希望 LeakCanary只在开发调试阶段运行发布版不受影响。本仓库自带的示例工程 samples/leakcanary-android-sample/build.gradle.kts 就是一份可直接对照的真实用法下文会反复引用它。第一步添加 leakcanary-android 依赖在应用模块的build.gradle文件中的dependencies块加入如下依赖dependencies { // debugImplementation because LeakCanary should only run in debug builds. debugImplementation com.squareup.leakcanary:leakcanary-android:{{ leak_canary.release }} }其中{{ leak_canary.release }}是文档构建时自动替换为当前发布版本的占位符实际使用时请替换为具体的版本号例如2.x系列的最新版。需要说明的关键点必须使用debugImplementation这保证 LeakCanary 只被打入 debug 构建release 构建完全不含该库避免把调试代码带入线上包。仓库示例工程正是这样做的// samples/leakcanary-android-sample/build.gradle.kts dependencies { debugImplementation(projects.leakcanary.leakcanaryAndroid) debugImplementation(projects.leakcanary.leakcanaryAppService) ... releaseImplementation(projects.leakcanary.leakcanaryAndroidRelease) }示例工程还展示了可选能力leakcanary-android-process独立的 LeakCanary 进程与leakcanary-android-releaserelease 构建中仅做对象监视而不分析等都属于进阶用法入门阶段只需上面一行依赖。添加这一行依赖后不需要写任何初始化代码——这就是文档中强调的 Thats it, there is no code change needed!。第二步理解零代码背后的自动初始化LeakCanary 之所以无需手动调用安装代码是因为它借助AndroidX Startup在应用启动时自动完成初始化。仓库中的 object-watcher/object-watcher-android-startup/src/main/java/leakcanary/AppWatcherStartupInitializer.kt 就是这一机制的核心实现class AppWatcherStartupInitializer : InitializerAppWatcherStartupInitializer { override fun create(context: Context) apply { val application context.applicationContext as Application AppWatcher.manualInstall(application) } override fun dependencies() emptyListClassout Initializer*() }AppWatcher.manualInstall(application)是安装的入口其默认参数定义在 object-watcher/object-watcher-android-core/src/main/java/leakcanary/AppWatcher.ktretainedDelayMillis默认5 秒TimeUnit.SECONDS.toMillis(5)对象被监视后等待 5 秒并触发 GC若弱引用仍未被清除则判定为 retained潜在泄漏watchersToInstall默认由appDefaultWatchers(application)生成包含ActivityWatcher、FragmentAndViewModelWatcher、RootViewWatcher、ServiceWatcher四类 watcher它们分别负责监视销毁的 Activity、销毁的 Fragment 及其 View、清除的 ViewModel、销毁的 Service。这四类 watcher 对应着 LeakCanary 自动检测的五种对象Fragment 与其 View 同属FragmentAndViewModelWatcher职责范围已销毁的Activity实例已销毁的Fragment实例已销毁 Fragment 的View实例已清除的ViewModel实例已销毁的Service实例从架构上看整个工作链路是AppWatcher 检测 retained 对象 → 通知 LeakCanary → 转储堆heap dump→ 使用 Shark 分析堆 → 分类并展示泄漏详见 docs/fundamentals-how-leakcanary-works.md。入门阶段你只需要知道集成后这些环节全部自动运行。第三步用 Logcat 确认 LeakCanary 已运行集成完成后最直接的验证方式是在 Android Studio 的 Logcat 中按LeakCanary标签过滤应能看到如下日志D LeakCanary: LeakCanary is running and ready to detect leaks这条日志对应的字符串资源定义在 leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_strings.xmlstring nameleak_canary_heap_dump_enabled_textLeakCanary is running and ready to detect memory leaks./string从源码结构看它会在两个场景被使用leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/InternalLeakCanary.kt 中当HeapDumpControl判定可以转储堆时打印到 Logcat即你看到的上述日志leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt 中作为 LeakCanary 自带界面 About 页面的状态文案。也就是说看到这条日志不仅说明依赖已生效还说明 LeakCanary 已进入可随时转储堆的待命状态。若日志没有出现请检查依赖是否写入了 debug 构建、debugImplementation是否误写成implementation、以及是否在模拟器或真机的 debug 包上运行。第四步监视自定义对象可选除了上述自动监视的五大类对象你还可以手动监视任何不再需要的对象例如已分离的 View 或已销毁的 PresenterAppWatcher.objectWatcher.watch(myDetachedView, View was detached)AppWatcher.objectWatcher是全局唯一的ObjectWatcher实例见 AppWatcher.kt它持有传入对象的弱引用。若 5 秒后弱引用未被清除且 GC 已运行该对象即被判定为 retained。Logcat 中会先出现监视日志约 5 秒后出现检查日志D LeakCanary: Watching instance of com.example.leakcanary.MainActivity (Activity received Activity#onDestroy() callback) ... 5 seconds later ... D LeakCanary: Scheduling check for retained objects because found new object retained如果你需要调整安装细节例如关闭某个 watcher 或修改保留判定延迟可以像仓库源码中展示的那样先通过布尔资源leak_canary_watcher_auto_install禁用自动安装再手动调用AppWatcher.manualInstall(...)?xml version1.0 encodingutf-8? resources bool nameleak_canary_watcher_auto_installfalse/bool /resourcesval watchersToInstall AppWatcher.appDefaultWatchers(application) .filter { it !is RootViewWatcher } AppWatcher.manualInstall( application application, watchersToInstall watchersToInstall )常见疑问与进阶指引发布版会包含 LeakCanary 吗不会。debugImplementation限定了作用域若确实需要在 release 中做轻量对象监视可参考示例工程中的leakcanary-android-release用法但它不执行堆分析与泄漏上报仅作监控用途。LeakCanary 多久转储一次堆默认当 retained 对象数量达到阈值时才转储应用可见时阈值为 5不可见时阈值为 1对应 LeakCanary.kt 中Config.retainedVisibleThreshold的默认值。此外Config还暴露了dumpHeap、dumpHeapWhenDebugging、maxStoredHeapDumps、computeRetainedHeapSize等可调参数Kotlin 中可用LeakCanary.config LeakCanary.config.copy(...)修改。检测到泄漏后去哪里看结果分析完成后 LeakCanary 会同时输出到通知栏与 LogcatHEAP ANALYSIS RESULT 块并区分 Application Leaks 与 Library Leaks点击通知可进入泄漏详情界面。接下来学什么建议按官方文档的顺序推进先读 docs/fundamentals.md 理解什么是内存泄漏及其危害再读 docs/fundamentals-how-leakcanary-works.md 掌握检测、转储、分析、分类四步原理之后用 docs/fundamentals-fixing-a-memory-leak.md 学习如何修复泄漏。遇到接入问题时docs/faq.md 与 docs/recipes.md 覆盖了大部分常见场景如如何确认 LeakCanary 正在运行如何自定义已知库泄漏列表等。小结LeakCanary 的入门成本极低一行debugImplementation依赖 一次 Logcat 日志确认即可完成集成。其零代码体验来自 AndroidX Startup 驱动的AppWatcher.manualInstall自动安装默认覆盖 Activity、Fragment、Fragment View、ViewModel、Service 五类对象并可在 5 秒判定延迟与对象监视范围上按需定制。本文对应的原始文档是 docs/getting_started.md仓库中的 AppWatcher.kt、AppWatcherStartupInitializer.kt 与 leakcanary-android-sample/build.gradle.kts 提供了可验证的实现依据适合对照阅读。【免费下载链接】leakcanaryA memory leak detection library for Android.项目地址: https://gitcode.com/gh_mirrors/le/leakcanary创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Browser Use 跑自然语言 UI 测试,模型通道改走 TaoToken 行不行?

Browser Use 跑自然语言 UI 测试,模型通道改走 TaoToken 行不行?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/19 18:08:41
C++手写数据挖掘系统:Apriori、FCM与ID3全流程实现

C++手写数据挖掘系统:Apriori、FCM与ID3全流程实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/19 18:03:41
概率统计工程化教学:用代码与实验重塑数据决策思维

概率统计工程化教学:用代码与实验重塑数据决策思维

简介:《概率论与数理统计》课程教学创新成果报告,面向高校数学教师、课程负责人及教学管理人员,聚焦公共基础课在专业衔接、课程思政、实践创新三方面的痛点。压缩包内仅含一个PDF文件,大小约1.12MB,内容集中&#xff…

📅 2026/9/19 18:03:41
MORE NEWS

更多资讯

📰

FortiGate路由实战:从静态路由、策略路由到OSPF/BGP与SD-WAN排错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

U盘报错0x80070570怎么修?从chkdsk到DiskGenius数据恢复全流程

1. 这个0x80070570到底是个什么鬼1.1 从一个真实的翻车现场说起上周帮朋友处理一台老笔记本,他插上U盘准备拷点资料,结果双击盘符直接弹窗——错误 0x80070570: 文件或目录损坏且无法读取。他第一反应是U盘坏了,准备下单买新的。我拦住了他&a…

📰

嵌入式WebRTC库:轻量C++实现,专为ARM/Linux物联网设备优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Mamba_ssm 安装避坑指南:wheel 预编译与源码编译全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

电动汽车动态无线充电副边整流桥无源控制方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

OHIF 下一代视口调度机制解析:legacy 与 native(GenericViewport)双轨切换的架构边界

OHIF 下一代视口调度机制解析:legacy 与 native(GenericViewport)双轨切换的架构边界 【免费下载链接】Viewers OHIF zero-footprint DICOM viewer and oncology specific Lesion Tracker, plus shared extension packages 项目地址: https…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬