Router
對於一個功能越來越複雜的APP來說,路由對於程式碼的解耦、頁面靈活跳轉配置、頁面攔截功能提供了很好的支援。下面我將分析業界比較出名的兩個路由框架WMRouter和ARouter的原始碼,瞭解他們的實現原理。
這兩個框架的實現核心原理是差不多的: 通過註解標註路由資訊,在編譯期動態掃描路由資訊,生成載入路由表資訊的java類。並利用 gradle transform
和asm
生成載入全部路由資訊的class檔案。在app執行時,路由框架反射呼叫這個class檔案,從而完成了路由表的裝載
下面就來具體分析一下這兩個框架的實現:
WMRouter
在看整個框架的工作原理之前,先來分析一下它的它是如何完成一次路由的:
那麼路由的基本類UriHandler
是如何生成的呢?
節點生成了?框架是怎麼在執行時動態載入這些路由節點的呢?
整個框架理解了上面這些基本就瞭解了其核心,再來分析一個Activity
的路由例項
ARouter
ARouter
的路由節點的動態載入類似於WMRouter
,就不再分析了,這裡主要看一下ARouter
中是如何組織路由節點,並做Uri的分發的,這是兩個框架最大的區別。
接下來就來看一下這兩個點在ARouter
中是如何處理的:
對比一下這兩個方案,以此來對Android
中對於一個路由框架需要的功能做更明確的理解:
方案對比
WMRouter | ARouter | |
---|---|---|
多scheme和host的支援 | ✅;可隨意新增,scheme、host不需要強制配置 | ❎;支援標準URL跳轉。有組的概念,一個路由(url)中的path必須屬於某個組 |
動態註冊路由節點 | ✅;@RouterUri標註 | ✅;@Route標註 |
URI正則匹配 | ✅;使用@RouterRegex標註,匹配的path可以直接跳轉到對應介面,比如weblink的跳轉可以配置正則匹配來路由 | ❎;組的概念存在,不支援 |
攔截器 | ✅;支援配置全域性攔截器和區域性攔截器,分別可配置多個,可以自定義攔截順序 | ✅;支援配置全域性攔截器,可以自定義攔截順序 |
轉場動畫 | ✅; | ✅; |
降級策略 | ✅;支援全域性降級和區域性降級 | ✅;支援全域性降級和區域性降級 |
跳轉監聽 | ✅;支援全域性和單次 | ✅;支援全域性和單次 |
跳轉引數 | ✅;支援基本型別和自定義型別 | ✅;支援基本型別和自定義型別 |
引數自動注入 | ❎; | ✅; @Autowired 註解的屬性可被自動注入 |
外部跳轉控制 | ✅; 需要配置入口Acitity,支援的uri需要在Manifest中配置 | ✅;需要配置入口Acitity,支援的uri需要在Manifest中配置 |
特殊頁面跳轉控制 | ✅;“exported”註解屬性配置,特定頁面可以配置不允許跳轉 | ❎; |
自動生成路由文件 | ❎; | ✅; |
路由節點的生成方式 | ✅; 框架載入時載入全部路由節點到記憶體 | ✅;按照組的劃分進行懶載入 |
路由節點擴充套件 | ✅;擴充套件性高,可以通過一個Uri不止做頁面的跳轉 | ✅; 一般 |
kotlin支援 | ❎;不支援,不過可以簡單引入kotlin來支援 | ✅; 支援 |
模組間通訊
WMRouter | ARouter | |
---|---|---|
獲取特定介面的實現 | ✅; @RouterService 註解配置,支援獲取介面的所有實現,或根據Key獲取特定實現 | ✅; @Route 註解配置,支援根據Path獲取對應介面實現 |
以上分析基於的框架版本:
WMRouter
: 1.1.0
ARouter
: 1.4.0
更多特性
這裡只是按照自己的理解做了簡單對比,關於兩個框架更多特性可訪問官方連結:
-
WMRouter: mp.weixin.qq.com/s/pKRi5qpZm…
-
ARouter : github.com/alibaba/ARo…
水平有限,如果錯誤,歡迎指出。
歡迎Star我的Android進階計劃,看更多幹貨。