一文了解Android中路由(Router)的實現

susion發表於2018-11-26

Router

對於一個功能越來越複雜的APP來說,路由對於程式碼的解耦、頁面靈活跳轉配置、頁面攔截功能提供了很好的支援。下面我將分析業界比較出名的兩個路由框架WMRouterARouter的原始碼,瞭解他們的實現原理。

這兩個框架的實現核心原理是差不多的: 通過註解標註路由資訊,在編譯期動態掃描路由資訊,生成載入路由表資訊的java類。並利用 gradle transformasm生成載入全部路由資訊的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

更多特性

這裡只是按照自己的理解做了簡單對比,關於兩個框架更多特性可訪問官方連結:

水平有限,如果錯誤,歡迎指出。

歡迎Star我的Android進階計劃,看更多幹貨。

相關文章