Android元件化之(路由 vs 元件匯流排)

齊翊發表於2018-03-24

前言

之前寫了一篇關於總結一波安卓元件化開源方案的文章,反響還不錯。後來,在QQ交流群(686844583)裡有人問到通訊機制這一對比項中路由元件匯流排的區別。由於通訊機制是元件化架構的核心引擎,是理論基礎,本文講解一下我對這兩種通訊機制的理解。

相同點

路由和元件匯流排都需要將分佈在不同元件module中的某些類按照一定規則生成對映表(資料結構通常是Map,Key為一個字串,Value為類或物件),然後在需要用到的時候從對映表中根據字串從對映表中取出類或物件

不同點

1. 路由方案(如:ARouter等)

1.1 路由的本質是類的查詢

其工作原理類似於倉庫管理員:大家先把類全部放到倉庫中,有人需要的時候,倉庫管理員就根據所提供的字串找出存放在倉庫中的類

查詢的類主要分為3種:Activity子類、Fragment子類和自定義介面實現類

  • Activity子類: 路由庫提供startActivity(或startActivityForResult)的封裝,並根據字串從對映表中獲取對應的Activity類(XxxActivity.class),跳轉到該Activity頁面
  • Fragment子類:路由庫根據字串從對映表中獲取對應的Fragment類(XxxFragment.class)並建立一個物件返回給呼叫方
  • 自定義介面實現類:路由庫根據字串(註解的字串或者介面類名字串)從對映表中獲取對應介面的實現類(XxxInterfaceImpl.class),並建立一個物件返回給呼叫方

1.2 路由這種一對一的類對映關係理解起來比較容易,特別是頁面跳轉,使用起來也很方便

1.3 元件之間的服務呼叫時,呼叫方需要持有介面類,需要將介面類定義下沉到base層,向介面程式設計,遵循依賴倒置原則

1.4 由於路由本質是類查詢,所以需要通訊的元件必須要打包在同一個app內部才能獲取到。

在元件單獨執行除錯時要將與之通訊的元件新增到自己的依賴列表中(比較常見的是必須依賴登入元件),既然開發過程中新增了依賴,開發人員就能直接呼叫到其它元件的程式碼,為了避免這種情況,需要做程式碼隔離,得到的元件化框架DDComponentForAndroid通過外掛很好地做到了這一點。

2. 元件匯流排方案(如:CC等)

2.1 元件匯流排的本質是轉發呼叫請求

其工作原理類似於電話接線員(中介者模式):元件匯流排負責收集所有元件類並形成對映表(Key為字串,Value為元件類的物件)。呼叫元件時,匯流排根據字串找到對應的元件類並將呼叫資訊轉發給該元件類,元件執行完成後再通過元件匯流排將結果返回給呼叫方

2.2 元件匯流排只負責通訊,即轉發呼叫請求和返回執行結果。

2.3 不需要下沉介面,面向通訊協議程式設計(類似於app客戶端呼叫伺服器端介面的通訊協議)

2.4 由於元件匯流排的本質是轉發呼叫請求,可以通過跨程式通訊方式將呼叫請求轉發給其它app,從而實現跨app進行元件呼叫。

Tips: 跨程式通訊的方式有很多種,例如:
BroadcastReceiver、Socket、FileObserver、MemoryFile、UrlScheme、ContentProvider、AIDL、Messenger及Binder等等
複製程式碼

支援跨app的元件呼叫後,單元件作為app執行時,可以與主app進行通訊,呼叫主app中的所有元件,無需與其他元件一起打包執行,所有的元件都是平行的,沒有依賴關係,帶來的好處有:

  • 從框架層面避免了元件之間的依賴,做到完全的程式碼隔離。
  • 元件獨立執行時編譯速度更快
  • 老專案改造時,從第一個元件開始就可以獨立執行,而不會因為需要呼叫到元件外的功能而必須跟主工程一起打包執行除錯

總結

通訊機制是Android元件化技術的基石,本文講述了兩種主要實現方式的相同點和不同點。

相關文章