Router/ARouter/路由框架原理及實現

路由框架

主流路由框架Router/ARouter/WMRouter等… 本文主要講解Router和ARouter的實現原理,並實現一個路由框架

1. 路由的作用與優點

1. 在一些複雜的業務場景下,靈活性比較強,很多功能都是動態配置的,比如下發一個活動頁面,我們事先並不知道具體的目標頁面,但如果事先做了約定,提前做好頁面映射,便可以自由配置。
2. 隨着業務量的增長,客戶端必然隨之膨脹,開發人員的工作量越來越大,比如64K問題,比如協作開發問題。App一般都會走向組件化的道路,而組件化的前提就是解耦,那麼我們首先要做的就是解耦頁面之間的依賴關係。
3. 簡化代碼,數行跳轉代碼精簡成一行代碼
4. 結果回調,每次跳轉都會回調跳轉結果
5. 編譯期處理註解,不影響運行時性能
6. 自定義攔截器,可以對路由進行攔截,比如登錄判斷和埋點處理
7. 支持多模塊使用,支持組件化開發

2. Router與ARouter用到的技術

關鍵技術有[android-apt][auto-service][javapoet]
android-apt :【註解處理技術】定義註解然後使用定義註解處理器,在註解處理器中操作相應的邏輯
auto-service : 【AutoService】使用apt來定義註解處理器要手動生成Processor配置文件,auto-service能通過該jar包META-INF/services/裏的配置文件找到具體的實現類名,並裝載實例化,完成模塊的注入
javapoet :【代碼生成框架】可以根據java的Api生成.java源文件

3. 生成路由表單過程

yyyyy
所以關鍵點就在註解處理器,在ARouter源碼的註解處理器中可以看到ARouter是通過獲取所有註解爲Router的類
yyyyy
然後將註解爲Router的類添加到一個RouteMeta,這個類只是負責存儲類型,組合路徑等,path通過獲取註解值獲得
yyyyy
通過routeVerify來講沒有聲明group的path中第一個單詞取爲默認組
yyyyy
然後通過javapoet來生成一個Map<String,Class<?>>這個map的key是Router的path,value就是註解的類(因爲是預編譯時生成的類所以不需要考慮性能問題)
yyyyy
上面是聲明註解的類,下面是預編譯生成的類
yyyyy

4. 動手實現一個路由框架

知道原理那麼實現起來就沒什麼難度了,因爲ARouter是採用apt+auto-service+javapoet 的組合實現預編譯生成java類,那麼我實現就換一種方式
這裏介紹一個類掃描神器【Reflections】可以根據指定包下或其他條件高效的掃描我們類下所有的類可以替換掉ARouter實現中的apt+auto-service方式
既然Reflections又高效又好用也能實現效果,那就換一種方式實現

yyyyy
就一個方法實現一個路由框架,不用reflections和apt其實就是用了DexFile的entries方法,來獲取DEX文件所包含類名的枚舉,類名的類型是一般內部格式(像java/lang/String)

OK一個簡易的路由框架就完了~ (σ゚∀゚)σ…:*☆哎喲不錯哦

yyyyy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章