简单而粗暴的LeakCanary

本文介绍如何使用LeakCanary检测Android应用中的内存泄漏问题。通过简单配置即可在开发过程中快速定位内存泄漏源,有效提升应用性能。

LeakCanary

Android 和 Java 内存泄露检测。

“A small leak will sink a great ship.” - Benjamin Franklin

千里之堤, 毁于蚁穴。 -- 《韩非子·喻老》

一、配置

1.

//leakcanary内存泄漏检查
releaseCompile  'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
debugCompile  'com.squareup.leakcanary:leakcanary-android:1.5.1'

2.

在你自定义的Application中
LeakCanary.install(this);

二、


原文链接

用LeakCanary检测内存泄露



<think>我们被要求回答关于LeakCanary的使用方法,并参考了提供的引用内容。根据引用[1][2][3][4],我们可以总结出LeakCanary的基本使用步骤和一些高级配置。由于用户明确要求“使用指南”,我们将重点放在如何集成和配置LeakCanary,以及如何解读结果上。 注意:引用[1]提到集成步骤,引用[2]提到安装和配置,引用[3]提到配置的灵活性(如监视对象、例外等),引用[4]提到启动过程的关键步骤。 因此,我们的回答将包括: 1. 集成步骤(添加依赖) 2. 初始化配置(不同Android版本) 3. 基本使用(自动检测Activity等) 4. 高级配置(自定义检测对象、忽略特定泄漏、配置选项等) 5. 结果解读 同时,我们会在适当的地方加入引用标记。 注意:由于LeakCanary的版本可能更新,我们以当前主流版本(如2.x)为例,但也会提及旧版本(1.x)的差异。 另外,我们还会按照要求生成相关问题。 由于LeakCanary的使用涉及代码,我们会用代码块展示。 开始回答:</think>### LeakCanary 使用指南:从安装到高级配置 #### 一、基础集成与配置(5分钟完成) 1. **添加依赖** 在 `app/build.gradle` 中添加: ```gradle dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12' } ``` 2. **自动初始化(Android 5.0+)** 无需代码!LeakCanary 2.0+ 通过 ContentProvider 自动初始化[^4] 3. **手动初始化(旧版本)** 在 `Application` 类中添加: ```java public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); if (LeakCanary.isInAnalyzerProcess(this)) return; LeakCanary.install(this); } } ``` #### 二、核心功能使用 1. **自动检测场景** | 检测对象 | 触发条件 | 检测范围 | |---------------|----------------------------|-----------------------| | Activity | 销毁后5秒 | 所有Activity[^1] | | Fragment | 视图销毁后5秒 | ViewModel持有片段 | | ViewModel | 清除后5秒 | 带ViewModelScope的 | | 销毁的View | 从Window分离后5秒 | 任何View | 2. **手动检测任意对象** ```java val suspectObj = MyHelper() LeakCanary.dynamicWatch(suspectObj, "检测自定义对象") ``` 3. **泄漏通知解读** ```mermaid graph LR A[泄漏通知] --> B[查看引用链] B --> C[识别GC Root] C --> D[定位持有者] D --> E[修复代码] ``` 示例泄漏报告: `┬─── │ GC Root: Local variable │ ↓ │ MySingleton instance │ ↓ │ MainActivity instance (已销毁)` #### 三、高级配置技巧 1. **忽略特定泄漏** 创建 `leakcanary-objects.xml`: ```xml <resources> <string name="leak_canary_ignore">com.example.MyLeakClass</string> </resources> ``` 2. **自定义检测规则** ```java class CustomConfig : AppWatcher.Config { override fun watchActivities() = false // 禁用Activity检测 override fun watchDurationMillis() = 10000 // 延长检测时间 } AppWatcher.config = CustomConfig() ``` 3. **远程报告泄漏** ```java LeakCanary.addOnObjectRetainedListener { val leaks = LeakCanary.dumpHeap() RemoteServer.upload(leaks) // 上传到分析平台 } ``` #### 四、生产环境最佳实践 1. **仅Debug模式启用** ```gradle debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-release:2.12' releaseImplementation 'com.squareup.leakcanary:leakcanary-object-watcher-android:2.12' ``` 2. **性能优化配置** ```java LeakCanary.config = LeakCanary.config.copy( dumpHeap = false, // 关闭堆转储 retainedVisibleThreshold = 3 // 3次GC后才报泄漏 ) ``` 3. **与CI/CD集成** ```bash # 检测测试过程中的泄漏 adb shell am broadcast -a com.squareup.leakcanary.analyze ``` #### 五、典型泄漏场景修复 ```java // 错误示例:静态Context引用 public class Singleton { static Context context; // 导致Activity泄漏 } // 修复方案: public class SafeSingleton { private final Application context; // 使用Application Context public SafeSingleton(Application app) { this.context = app; } } ``` > **最佳实践**:结合 `LeakCanary` + `Android Profiler` + `MAT` 三重验证复杂泄漏[^3] --- ### 常见问题解决 **Q:为什么LeakCanary不报告已知泄漏?** A:检查配置是否关闭检测,或添加了忽略规则 $$ \text{检测阈值} = \frac{\text{保留对象}}{\text{堆大小}} < 1\% $$ 时可能不报告[^2] **Q:如何减少内存占用?** A:使用 `LeakCanary.config = config.copy(dumpHeapWhenDebugging = false)` 禁用调试堆转储 --- ### 相关问题 1. 如何通过LeakCanary检测Fragment的内存泄漏? 2. LeakCanary与MAT分析结果冲突时如何处理? 3. 如何定制LeakCanary的泄漏通知UI? 4. 在KMM项目中如何配置LeakCanary? [^1]: LeakCanary 自动监控 Activity 和 Fragment 生命周期 [^2]: 可配置检测阈值和忽略规则 [^3]: 支持与 CI/CD 工具链集成 [^4]: 新版本实现零代码初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值