LeakCanary源码分析第一讲

本文将分析LeakCanary源码,介绍LeakCanary核心组件以及LeakCanary注册流程。如果你还不知道LeakCanary是什么,那么请一定要看这篇文章:LeakCanary让Android内存泄漏无处遁形

LeakCanary是Android内存泄漏检测工具,能够将内存泄漏在开发的过程中就暴露出来。

LeakCanary核心组件

LeakCanary-class-diagram 上面的类图可以分为三层来看,第一层包括ActivityRefWatcher、RefWatcher,第三层是Service,第二层是HeapDump.Listener它是用来衔接Watcher与Service的桥梁。

ActivityRefWatcher:它通过watchActivities方法将全局的Activity生命周期回调接口Application.ActivityLifecycleCallbacks注册到application。

注册给application的Activity生命周期回调接口,会在Activity的onDestroy方法调用时回调。这是在API14 ICE_CREAM_SANDWICH才引入的接口。

RefWatcher:它是LeakCanary核心中的核心,要知道RefWatcher的工作原理,你必须要先了解Java的引用类型。RefWatcher的工作就是触发GC,如果对象被回收,那么WeakReference将被放入ReferenceQueue中,否则就怀疑有泄漏(仅仅是怀疑),然后将内存dump出来,为接下来的深入分析做准备。

Java的引用类型包括:强引用(StrongReference),弱引用(WeakReference),软引用(SoftReference),虚引用也叫幽灵引用(PhantomReference)。关于Java引用类型本文不做详细讲解。

HeapDump.Listener与ServiceHeapDumpListener:ServiceHeapDumpListener实现了HeapDump.Listener接口。当RefWatcher发现可疑引用的之后,它将dump出来的Hprof文件通过listener传递到HeapAnalyzerService。

HeapAnalyzerService:它主要是通过HeapAnalyzer.checkForLeak分析对象的引用,计算出到GC root的最短强引用路径。然后将分析结果传递给DisplayLeakService

AbstractAnalysisResultService与DisplayLeakService:DisplayLeakService继承了AbstractAnalysisResultService。它主要是用来处理分析结果,将结果写入文件,然后在通知栏报警。

LeakCanary注册过程与触发过程分析

leakcanary_install_sequence LeakCanary注册过程分析:其实就是将ActivityRefWatcher中的Application.ActivityLifecycleCallbacks接口注册到Application中,从方法的调用序列中可以清楚的看到,registerActivityLifecycleCallbacks就是整个注册的核心接口。

触发watch动作过程分析:当Activity的onDestroy调用的时候,Application会收到通知,然后调用lifecycleCallback.onActivityDestroyed()方法,最终RefWatcher的watch方法被触发,也就实现了Activity内存泄漏分析自动分析。

总结

本篇是LeakCanary源码分析第一篇,只是对核心组件以及主要流程进行简要介绍,后续的文章中将进行更为详细的讲解。



  copyright@黑月神话,转载请注明出处:vjson.com

LeakCanary源码分析第一讲》上有1条评论

发表评论