最簡單有效的Android元件化方案 之 APP元件化簡介
最簡單有效的Android元件化方案,github開源地址 ofollow,noindex">https://github.com/beyondxia/modules
1 、什麼是元件化
在談什麼是元件化之前,我們需要先了解什麼是業務模組。那什麼是業務模組呢,從研發角度來講,說白了,就是APP中一些功能相對較獨立的,又一個或一波人維護的,有獨立業務形態的程式碼集合。配一張圖感受一下 _ ,購物模組,會員模組,電影模組,酒店模組等一般就可以理解為一個業務模組。

image.png
其實我們的元件化就是針對業務模組開展的,每個業務都能成為一個獨立的元件,可以獨立開發,獨立編譯(甚至獨立執行和測試)。業務之間通過一系列的介面或協議作用通訊的橋樑,除此之後,大家互不關心,各業務獨立完全隔離。
2 、為什麼要元件化
由於每個業務模組的開發人員往往是不同的,試想一下,如果所有的模組程式碼都位於一個程式碼倉,所有的模組程式碼都是耦合在一起,沒有元件的概念,那麼:
- 開發效率必然會比較低,定位問題比較難
- 程式碼修改風險高,一個模組程式碼的修改,可能會應用其他模組。
- 編譯時間久,哪怕只是一個模組的修改,必須編譯整個應用。
- 程式碼結構不清晰,架構不夠穩定,也不便於擴充套件和元件複用
- 等等
3、元件化開發步驟
要實現元件化開發,主要要做兩件事:1. 首先需要業務間程式碼解耦。2. 元件間通訊
4、實現方案
4.1、解耦
按照元件化開發步驟,實現元件化首先要實現的是程式碼間解耦,解耦的目的是讓業務間沒有任何程式碼依賴,沒有程式碼交叉呼叫,但是又要能做到解耦後的正常通訊和資料傳輸。
針對解耦,目前傳統的做法是介面暴露方式:業務模組以介面或協議的方式暴露該模組的方法和功能,主app啟動時(或適當的時機)註冊各個業務暴露的方法和功能,我們也採用了類似的做法,架構圖如下:

image.png
每個業務模組以service的方式暴露自己的功能和介面給到中間服務層(位於業務層之下),服務層收集各個業務暴露的方法和介面,在應用啟動時(或適當的時機)註冊,其他業務模組向服務層獲取各個模組暴露的服務, 如圖中紅色部分。
服務層維護一個HashMap存放雖有的服務,如下:

image.png
並提供註冊和獲取服務的方法:

image.png
建議每個業務模組註冊一個服務,當然,可以根據業務的,一個模組也可以註冊多個服務:

image.png
其他業務模組根據服務名獲取服務並呼叫服務暴露的方法:

image.png
至此,我們可以通過增加中間服務層的方式,達到程式碼解耦的目的。這也是目前業界解耦的常用方法。
4.2、通訊方式
業務隔離後,就需要一套通訊方式,使各業務可以進行方便高效的通訊,其實通訊方式,莫過於以下三種:
-
call(模組間函式呼叫):每個獨立的業務模組暴露Service介面,供外界呼叫,如:
image.png
-
notify/publish(模組間通知):每個業務模組註冊全域性的感興趣的事件,事件產生後通知 ,可以使用rxbus,通知,路由等方式,本文贊不對該項進行討論:
image.png
-
router(模組間頁面跳轉):UI跳轉 ,統一使用路由方式,三端統一路由可以使用Arouter,ActivityRouter等開源框架,本文暫不做討論.
至此,通訊方案介紹完成。