閒餘期間我把Android程式設計師幾個常用的開源庫總結出了原理和原始碼,408頁PDF詳細解答

Android-until發表於2020-11-30

之前國慶假期想著閒著也是閒著,就想著來深入瞭解下幾個常用的開源庫??,看下其實現原理和原始碼,進行總結並輸出成一份PDF資源。現已總結了 EventBus、ARouter、LeakCanary、Glide、Coil、Retrofit、OkHttp 等幾個。

主要整理成了以下十個模組:

三方庫原始碼筆記(1)-EventBus 原始碼詳解
三方庫原始碼筆記(2)-EventBus 自己實現一個?
三方庫原始碼筆記(3)-ARouter 原始碼詳解
三方庫原始碼筆記(4)-ARouter 自己實現一個?
三方庫原始碼筆記(5)-LeakCanary 原始碼詳解
三方庫原始碼筆記(6)-LeakCanary 擴充套件閱讀
三方庫原始碼筆記(7)-超詳細的 Retrofit 原始碼解 析
三方庫原始碼筆記(8)-Retrofit 與 LiveData 的 結合使用
三方庫原始碼筆記(9)-超詳細的 Glide 原始碼詳解
三方庫原始碼筆記(10)-Glide 你可能不知道的知 識點

1.EventBus 原始碼詳解

我們知道,EventBus 在有訊息被髮送出來時,可以直接為我們回撥該訊息的所有監聽方法,回撥操作是通過反射 method.invoke 來實現的。那麼 EventBus 在回撥之前也必須先拿到所有的監聽方法才行,這樣才知道該訊息型別對應什麼監聽方法以及對應多少監聽方法。

主要內容:

  • 註冊
  • 傳送訊息
  • 解除註冊
  • 註解處理器
  • 一些坑

2.自己實現一個EventBus

對於一個優秀的第三方庫,開發者除了要學會如何使用外,更有難度的用法就是去了解實現原理、懂得如何改造甚至自己實現。接下來就來自己動手實現一個 EventBus,不求功能多齊全,就來實現簡單的註冊、反註冊、傳送訊息、接收訊息這些功能即可??

主要內容:

  • 需要做什麼
  • 註解處理器
  • EasyEventBus

3.ARouter 原始碼詳解

路由框架在大型專案中比較常見,特別是在專案中擁有多個 moudle 的時候。為了實現元件化,多個 module 間的通訊就不能直接以模組間的引用來實現,此時就需要依賴路由框架來實現模組間的通訊和解耦:sunglasses:

而 ARouter 就是一個用於幫助 Android App 進行元件化改造的框架,支援模組間的路由、通訊、解耦。

主要內容:

  • 初始化
  • 跳轉到 Activity
  • 跳轉到 Activity 並注入引數
  • 控制反轉
  • 攔截器
  • 註解處理器

4.自己實現一個ARouter

對於一個優秀的第三方庫,開發者除了要學會如何使用外,更有難度的用法就是去了解實現原理、懂得如何改造甚至自己實現。接下來就自己動手實現一個路由框架,因為自己實現的目的不在於做到和 ARouter 一樣功能完善,而只是一個練手專案,目的是在於加深對 ARouter 的原理理解,所以自己的自定義實現就叫做 EasyArouter 吧 ??

主要內容:

  • 前置準備
  • 註解處理器
  • EasyRouter

5.LeakCanary 原始碼詳解

LeakCanary是由 Square 公司開源的用於 Android 的記憶體洩漏檢測工具,可以幫助開發者發現記憶體洩露情況並且找出洩露源頭,有助於減少 OutOfMemoryError 情況的發生。在目前的應用開發中也算作是效能優化的一個重要實現途徑,很多面試官在考察效能優化時都會問到 LeakCanary 的實現原理。

主要內容:

  • 支援的記憶體洩露型別
  • 初始化
  • ObjectWatcher:檢測任意物件
  • ActivityDestroyWatcher:檢測 Activity
  • FragmentDestroyWatcher:檢測 Fragment
  • ViewModelClearedWatcher:檢測 ViewModel
  • 檢測到記憶體洩露後的流程

6.LeakCanary 擴充套件閱讀

Java 的一個很顯著的優點就在於記憶體自動回收機制,Java 通過垃圾收集器(Garbage Collection,GC)來自動管理記憶體的回收過程,而無需開發者來主動釋放記憶體。這種自動化行為有效地節省了開發人員的開發成本,但也讓一些開發者誤以為 Java 就不存在記憶體洩漏的問題了,或者是誤認為記憶體洩露應該是 GC 或者 JVM 層面來關心和解決的問題。這種想法是不正確的,因為記憶體洩露大多時候是由於程式本身存在缺陷而導致的,GC 和 JVM 並無法精準理解程式的實現初衷,所以還是需要由開發人員來主動解決問題。

主要內容:

  • 記憶體洩露和記憶體溢位
  • 記憶體管理
  • 常見的記憶體洩露

7.超詳細的 Retrofit 原始碼解析

Retrofit 也是現在 Android 應用開發中的標配之一了,今天就來對 Retrofit 進行一次(自我感覺的)全面的原始碼解析。

主要內容:

  • Retrofit.create()
  • ServiceMethod
  • HttpServiceMethod
  • OkHttpCall
  • API 方法是如何解析的?
  • ResponseBody 是如何對映為 UserBean 的?
  • Call 是如何替換為 Observable 的?
  • 整個資料轉換流程總結
  • 如何實現以 Kotlin 協程的方式來呼叫?
  • Retrofit 對 Android 平臺做了什麼特殊支援?

8.Retrofit 與 LiveData 的 結合使用

我們在搭建專案的網路請求框架的時候,一個重要的設計環節就是要避免由於網路請求結果的非同步延時回撥導致記憶體洩漏情況的發生,所以在使用 RxJava 的時候我們往往是會搭配 RxLifecycle 來一起使用。而 Google 推出的 Jetpack 元件一個很大的亮點就是提供了生命週期安全保障的 LiveData。

LiveData 是基於觀察者模式來實現的,也完全符合我們在進行網路請求時的使用習慣。所以,本篇文章就來動手實現一個 LiveDataCallAdapter,即實現以下方式的網路請求回撥。

主要內容:

  • 基礎定義
  • LiveDataCallAdapter

9.超詳細的 Glide 原始碼詳解

Glide 的原始碼有點複雜,所以換個思路來看原始碼:以小點來劃分,每個小點只包含 Glide 實現某個功能或目的時所涉及的流程,以此來簡化理解難度,通過整合多個小的功能點來把控住 Glide 大的實現方向。

主要內容:

  • 前置準備
  • 如何監聽生命週期
  • 怎麼注入 Fragment
  • 如何啟動載入圖片的任務
  • 載入圖片的具體流程
  • 如何分辨不同的載入型別
  • 一共包含幾個執行緒池
  • 如何自定義網路請求庫
  • 記憶體清理機制

10.關於Glide 你可能不知道的知識點

主要內容:

  • 利用 AppGlideModule 實現預設配置
  • 自定義網路請求元件
  • 實現圖片載入進度監聽
  • 自定義磁碟快取 key
  • 如何直接拿到圖片
  • Glide 如何實現網路監聽

完整目錄:

現在都說網際網路寒冬,其實只要自身技術能力夠強,我們們就不怕!

以上內容均放在了開源專案:github 中已收錄,裡面包含不同方向的自學Android路線、面試題集合/面經、及系列技術文章等,資源持續更新中...

相關文章