最簡單有效的Android組件化方案,github開源地址 https://github.com/beyondxia/modules
1 瓢捉、什么是組件化
????在談什么是組件化之前捂刺,我們需要先了解什么是業(yè)務(wù)模塊到踏。那什么是業(yè)務(wù)模塊呢鲫竞,從研發(fā)角度來講,說白了铲觉,就是APP中一些功能相對較獨立的澈蝙,又一個或一波人維護(hù)的,有獨立業(yè)務(wù)形態(tài)的代碼集合撵幽。配一張圖感受一下_灯荧,購物模塊,會員模塊并齐,電影模塊漏麦,酒店模塊等一般就可以理解為一個業(yè)務(wù)模塊客税。
????其實我們的組件化就是針對業(yè)務(wù)模塊開展的况褪,每個業(yè)務(wù)都能成為一個獨立的組件,可以獨立開發(fā)更耻,獨立編譯(甚至獨立運行和測試)测垛。業(yè)務(wù)之間通過一系列的接口或協(xié)議作用通信的橋梁,除此之后秧均,大家互不關(guān)心食侮,各業(yè)務(wù)獨立完全隔離。
2 目胡、為什么要組件化
????由于每個業(yè)務(wù)模塊的開發(fā)人員往往是不同的锯七,試想一下,如果所有的模塊代碼都位于一個代碼倉誉己,所有的模塊代碼都是耦合在一起眉尸,沒有組件的概念,那么:
- 開發(fā)效率必然會比較低巨双,定位問題比較難
- 代碼修改風(fēng)險高噪猾,一個模塊代碼的修改,可能會應(yīng)用其他模塊筑累。
- 編譯時間久袱蜡,哪怕只是一個模塊的修改,必須編譯整個應(yīng)用慢宗。
- 代碼結(jié)構(gòu)不清晰坪蚁,架構(gòu)不夠穩(wěn)定奔穿,也不便于擴展和組件復(fù)用
- 等等
3、組件化開發(fā)步驟
????要實現(xiàn)組件化開發(fā)迅细,主要要做兩件事:1. 首先需要業(yè)務(wù)間代碼解耦巫橄。2. 組件間通信
4、實現(xiàn)方案
4.1茵典、解耦
????按照組件化開發(fā)步驟湘换,實現(xiàn)組件化首先要實現(xiàn)的是代碼間解耦,解耦的目的是讓業(yè)務(wù)間沒有任何代碼依賴统阿,沒有代碼交叉調(diào)用彩倚,但是又要能做到解耦后的正常通信和數(shù)據(jù)傳輸。
????針對解耦扶平,目前傳統(tǒng)的做法是接口暴露方式:業(yè)務(wù)模塊以接口或協(xié)議的方式暴露該模塊的方法和功能帆离,主app啟動時(或適當(dāng)?shù)臅r機)注冊各個業(yè)務(wù)暴露的方法和功能,我們也采用了類似的做法结澄,架構(gòu)圖如下:
每個業(yè)務(wù)模塊以service的方式暴露自己的功能和接口給到中間服務(wù)層(位于業(yè)務(wù)層之下)哥谷,服務(wù)層收集各個業(yè)務(wù)暴露的方法和接口,在應(yīng)用啟動時(或適當(dāng)?shù)臅r機)注冊麻献,其他業(yè)務(wù)模塊向服務(wù)層獲取各個模塊暴露的服務(wù)们妥, 如圖中紅色部分。
服務(wù)層維護(hù)一個HashMap存放雖有的服務(wù)勉吻,如下:
并提供注冊和獲取服務(wù)的方法:
建議每個業(yè)務(wù)模塊注冊一個服務(wù)监婶,當(dāng)然,可以根據(jù)業(yè)務(wù)的齿桃,一個模塊也可以注冊多個服務(wù):
其他業(yè)務(wù)模塊根據(jù)服務(wù)名獲取服務(wù)并調(diào)用服務(wù)暴露的方法:
至此惑惶,我們可以通過增加中間服務(wù)層的方式,達(dá)到代碼解耦的目的短纵。這也是目前業(yè)界解耦的常用方法带污。
4.2、通信方式
業(yè)務(wù)隔離后香到,就需要一套通信方式鱼冀,使各業(yè)務(wù)可以進(jìn)行方便高效的通信,其實通信方式养渴,莫過于以下三種:
-
call(模塊間函數(shù)調(diào)用):每個獨立的業(yè)務(wù)模塊暴露Service接口雷绢,供外界調(diào)用,如:
-
notify/publish(模塊間通知):每個業(yè)務(wù)模塊注冊全局的感興趣的事件理卑,事件產(chǎn)生后通知 翘紊,可以使用rxbus,通知藐唠,路由等方式帆疟,本文贊不對該項進(jìn)行討論:
router(模塊間頁面跳轉(zhuǎn)):UI跳轉(zhuǎn) 鹉究,統(tǒng)一使用路由方式,三端統(tǒng)一路由可以使用Arouter踪宠,ActivityRouter等開源框架自赔,本文暫不做討論.
至此,通信方案介紹完成柳琢。