LeakCanary 使用方法你真的用对了吗?

LeakCanary 使用方法你真的用对了吗?
最新回答
诗雨伊意

2021-06-27 07:54:58

众所周知,Square 出品的内存泄漏检测工具 LeakCanary 可以很方便的检测出 App 中存在的内存泄漏问题。当我们决定要不要在项目中引入 LeakCanary 的时候,经常也会听到声音:"一度我也是这么认为的,直到我认真研究了下才发现,事实可能并没有那么简单。本文就是尝试从 LeakCanary 的一些高级用法,来重新论证上述的观点。 文末会附上完整代码,可直接使用。"

想要使用 LeakCanary 的一些高级用法,首先就是需要我们主动掌握 LeakCanary 的初始化时机,添加一些自定义的配置,下面就看一下如何手动初始化 LeakCanary ?

手动初始化的时候,我们就可以根据自己的需要添加想要检测的类型,如果我们不想检测RootView 的类型,则可以如下定义:

想要对 LeakCanary 添加一些自定义的配置,就需要禁用自动初始化的逻辑,上面也有提到在资源文件中添加leak_canary_watcher_auto_install **值即可,如下:

手动初始化的时候,我们就可以根据自己的需要添加想要检测的类型,如果我们不想检测RootView 的类型,则可以如下定义:

在探索如何解决LeakCanary 卡顿相关的问题上,通过将整个 dump hprof 文件的过程放到一个单独的进程中做,这样就可以尽可能少的影响主进程的操作。使用leakcanary-android-process 模块可以实现这一目的。

使用 KOOM 库中的一个包koom-fast-dump 可以在 LeakCanary 的配置方式下解决卡顿问题。通过使用 WorkManager 来处理跨进程通讯,LeakCanary 自带的跨进程方案以及 KOOM 的实现效果是一样的,都会切换到子进程。

无论是使用koom-fast-dump 还是 leakcanary-android-process,都可以解决 LeakCanary dump 内存时卡顿的问题。默认情况下,使用 leakcanary-android-process更加方便,如果是想要想要自定义 HeapDump 相关逻辑话,使用 koom-fast-dump会相对简单一点。

通过配置 Config 来自定义 HeapDump 逻辑,除此之外还可以监听 LeakCanary 的主要事件,然后做一些我们想要的事情,比如把相关问题上传到 Crash 平台或者是质量平台上,方便从宏观的角度治理内存泄漏问题。

解决了卡顿问题之后,在线上使用 LeakCanary 似乎也不是那么遥不可及了,下面我们看一下如何在线上使用 LeakCanary。想要在线上使用 LeakCanary 首要要确定以下问题:监听 LeakCanary 事件。监听 LeakCanary dump 以及内存分析事件可以通过LeakCanary.Config 进行配置,SDK 内部内置了一下监听器。

到这了我们就已经能够拿到 LeakCanary 分析的内存泄漏结果了。但是这里的结果,跟我们平时使用的 Crash 上报信息并不能直接匹配,因为这里并没有直接可以使用的堆栈信息,需要我们自己进行拼接。下面就看一下如何通过 LeakCanary 中的信息构造对应的 Throwable。

调整监控策略时,需要考虑在用户不使用当前 App 的时候进行处理,可能的场景就是 App 切到后台或者是手机息屏时才开始处理相关的任务。通过云端下发配置的方式可以动态控制是否开启 LeakCanary 的监控功能。

使用 LeakCanary 采集内存泄漏的建议方式如下:以上逻辑的代码已上传至 gist ,感兴趣的同学可以自取。总结:在 Debug 环境中使用 LeakCanary 的确是添加一行依赖就能搞定了,包括对多进程的开启也是如此,真的算是开箱即用了。在 Release 环境使用,也有对应的方案,但是整体方案还处于实验阶段,建议控制好使用范围。通过上述的了解,你可以对之前对 LeakCanary 留下的刻板印象有一个新的看法了。