Android开发者,是时候了解LeakCanary了( 三 )


核心代码如下
这段代码中涉及到了专为LeakCanary设计的Shark库的用法,在这里就不多解释了 。大概介绍一下每一步的作用:

  • 首先调用HprofHeapGraph.indexHprof方法,这个方法会把dump出来的各种实例instance,Class类对象和Array对象等都建立起查询的索引,以record的id作为key,把需要的信息都存储在Map中便于后续取用
  • 调用findLeakInput.findLeak方法,这个方法会从GC Root开始查询,找到最短的一条导致泄露的引用链,然后再根据这条引用链构建出LeakTrace 。
  • 把查询出来的LeakTrace对外展示
总结
本篇文章分析了LeakCanary检测内存泄露的思路和一些代码的设计思想,但是限于篇幅不能面面俱到 。接下来我们回答一下文章开头提出的问题 。
1.LeakCanary是如何使用ObjectWatcher 监控生命周期的?
LeakCanary使用了Application的ActivityLifecycleCallbacks和FragmentManager的FragmentLifecycleCallbacks方法进行Activity和Fragment的生命周期检测,当Activity和Fragment被回调onDestroy以后就会被ObjectWatcher生成KeyedReference来检测,然后借助HeapDumpTrigger的轮询和触发gc的操作找到弹出提醒的时机 。
2.LeakCanary如何dump和分析.hprof文件的?
使用Android平台自带的Debug.dumpHprofData方法获取到hprof文件,使用自建的Shark库进行解析,获取到LeakTrace
转载 https://mp.weixin.qq.com/s/plD0g16u0VEqVXDQJrhhpA




推荐阅读