應(yīng)用層的使用和改進(jìn):
深入Leakcanary的源碼:
LeakCanary原理
原理:
正常情況下一個(gè)Activity在執(zhí)行Destroy之后就要銷毀臊恋,LeakCanary做的就是在一個(gè)Activity Destroy之后將它放在一個(gè)WeakReference中,然后將這個(gè)WeakReference關(guān)聯(lián)到一個(gè)ReferenceQueue篡悟,查看ReferenceQueue是否存在Activity的引用,如果不在這個(gè)隊(duì)列中础钠,執(zhí)行一些GC清洗操作恰力,再次查看。如果不存在則證明該Activity泄漏了旗吁,之后Dump出heap信息踩萎,并用haha這個(gè)開源庫(kù)去分析泄漏路徑。
源碼結(jié)構(gòu)
1.leakcanary-watcher: 這是一個(gè)通用的內(nèi)存檢測(cè)器很钓,對(duì)外提供一個(gè) RefWatcher#watch(Object watchedReference),它不僅能夠檢測(cè)Activity香府,還能監(jiān)測(cè)任意常規(guī)的 Java Object 的泄漏情況董栽。
2.leakcanary-android: 這個(gè) module 是與 Android 的接入點(diǎn),用來專門監(jiān)測(cè) Activity 的泄漏情況企孩,內(nèi)部使用了 application#registerActivityLifecycleCallbacks 方法來監(jiān)聽 onDestory 事件锭碳,然后利用 leakcanary-watcher 來進(jìn)行弱引用+手動(dòng) GC 機(jī)制進(jìn)行監(jiān)控。
3.leakcanary-analyzer: 這個(gè) module 提供了 HeapAnalyzer勿璃,用來對(duì) dump 出來的內(nèi)存進(jìn)行分析并返回內(nèi)存分析結(jié)果AnalysisResult擒抛,內(nèi)部包含了泄漏發(fā)生的路徑等信息供開發(fā)者尋找定位。
4.leakcanary-android-no-op: 這個(gè) module 是專門給 release 的版本用的补疑,內(nèi)部只提供了兩個(gè)完全空白的類 LeakCanary 和 RefWatcher歧沪,這兩個(gè)類不會(huì)做任何內(nèi)存泄漏相關(guān)的分析。因?yàn)?LeakCanary 本身會(huì)由于不斷 gc 影響到 app 本身的運(yùn)行莲组,而且主要用于開發(fā)階段的內(nèi)存泄漏檢測(cè)诊胞。因此對(duì)于 release 則可以 disable 所有泄漏分析。