LeakCanary还能这样????(自定义保存泄漏信息)
2019-01-21 本文已影响0人
花花是男神
对于Android开发来说,用leakcanary来检测内存泄漏很是方便与快捷的。但是由于本人工作原因,LeakCanary用起来着实无法满足需求,因为我是开发机顶盒和车机的Android系统app,这个时候系统不发弹出Notifaciton,就无法看到内存泄漏的具体信息。有人会说看源码,在show提示Notification的之前,会保存当时分析的内存快照以及结果问题,如下:

leakcanary是保存了相关信息,但是本人打开result的文件部分乱码,所有信息糅杂在一起,及其没办法分析。所以在此情况下,研读一下leakcanary源码流程,根据版本情况共汇总两种改法。
第一种(推荐)
偶然间发现在新版本中,leakcanary源码中的DisplayLeakService.java类中新加了一个空方法,如下:

看注释,原来是可以集成此类复写此方法,留给有缘人发挥的啊,真是官方介绍里面也不提一下,小弟很难找到还有此天堂代码。废话不多说,上代码。
一、集成DisplayLeakService类,重写afterDefaultHandling()方法,实现自己的泄流信息保存


二、在manifest.xml文件中注册该service

三、比较重要,在Application中注册的时候要根据源码的来如下:
源码中如是写到:

于是在自己的Application中:

以上,大功告成。
第二种
在早期版本中,就只有老老实实的把源码下载下来(官方下载地址:git@github.com:square/leakcanary.git),如图:

将红框中的module合并在一起。接下来就是保存我们自己的信息文件了,
一、修改就在AbstractAnalysisResultService.java中的sendResultToListener方法新增如下代码:

二、在AnalyzedHeap.java中新增save()方法:如下:

就这样,很简单的完成了,保存路径可以随意更改,将此module引入自己的项目中,用法完全不用改变。
以上仅是自己的一点经验,如有不足之处请多多指教,谢谢。