最近在重構(gòu)公司的一個(gè)項(xiàng)目,準(zhǔn)備把項(xiàng)目進(jìn)行模塊化,順便記錄一下在重構(gòu)過程中的一些感想。 ?
Android模塊化設(shè)計(jì)方案系列文章:
Android模塊化設(shè)計(jì)方案之接口API化
Android發(fā)展到現(xiàn)在,關(guān)于各種模塊化開發(fā)的文章不勝枚舉,盡管有很多珠玉在前,但我還想記錄一下我對(duì)模塊化開發(fā)的的一些想法,算是對(duì)自己學(xué)習(xí)過程的一個(gè)總結(jié)和肯定。
關(guān)于模塊化開發(fā)的優(yōu)勢(shì),網(wǎng)上有很多介紹,這里就不再贅述了,直接上圖。
上圖是我對(duì)模塊化設(shè)計(jì)的一個(gè)觀點(diǎn),下面解釋一下各個(gè)模塊的意義:

實(shí)線箭頭:依賴關(guān)系
虛線箭頭:派生關(guān)系
App ①、App ②:這兩個(gè)最頂層的模塊就是我們打包app時(shí)候的殼工程,模塊中不包含具體的業(yè)務(wù)邏輯。
ModuleA、ModuleB...:把項(xiàng)目主體功能拆分成的能各自獨(dú)立運(yùn)行的模塊,比如購(gòu)物城功能、用戶信息管理等,這些模塊之間關(guān)聯(lián)不是那么緊密,在協(xié)作開發(fā)過程中,也往往不是同一個(gè)人負(fù)責(zé),拆分成不同的模塊也能在協(xié)作開發(fā)的過程中,把相互間的干擾降到最低,提高協(xié)作開發(fā)的效率。
Router:路由組件,無(wú)需贅言。
ApiA、ApiB...:對(duì)應(yīng)的ModuleA、ModuleB中對(duì)外暴露出的接口、實(shí)體類、路由表等。在我們開發(fā)過程中,雖然盡最大可能的避免模塊間的耦合,但是夸模塊的調(diào)用始終無(wú)法避免,為了解決需要跨模塊調(diào)用的接口、實(shí)體類等下沉到Common中導(dǎo)致Common臃腫的問題,通過對(duì)類的api化,從module中派生出對(duì)應(yīng)的api模塊,提供給其他模塊依賴。
Business Common:與項(xiàng)目相關(guān)的基礎(chǔ)依賴庫(kù),主要用于存放模塊間共享的資源,比如TitleBar,NavigateBar等,這些widget或者資源文件與我們的業(yè)務(wù)息息相關(guān),又在多個(gè)模塊中需要使用,于是用單獨(dú)的模塊進(jìn)行管理。
ThridLibs:第三方類庫(kù)我們?cè)陂_發(fā)過程中不可避免的會(huì)使用到第三方類庫(kù),比如分享,地圖,編解碼等模塊,這些模塊的核心功能與業(yè)務(wù)關(guān)聯(lián)不大,因此我們?cè)趯?duì)三方類庫(kù)進(jìn)行封裝之后放入單獨(dú)的模塊,并把需要暴露的方法抽象成接口,供上層模塊調(diào)用。
ThridLibs Proxy:第三方類庫(kù)的代理模塊,是為了避免直接使用三方類庫(kù),對(duì)上面的那個(gè)模塊抽象出來(lái)的接口進(jìn)行動(dòng)態(tài)/靜態(tài)代理,方便我們以后敏捷的對(duì)三方類庫(kù)進(jìn)行更改。
Base Common:與業(yè)務(wù)無(wú)關(guān)的基礎(chǔ)模塊,比如我們封裝的BaseActivity、BaseFragment等,我們可以把這個(gè)類庫(kù)用到其他的項(xiàng)目中,也是我們?cè)陂_發(fā)中的基礎(chǔ)沉淀。
Utils:這個(gè)模塊比較簡(jiǎn)單,就是日常中用到的一些工具類,比如FileUtil、AppUtil等。
這些module可以Git子模塊的形式存在于住項(xiàng)目之中的(還不了解子模塊的同學(xué)請(qǐng)進(jìn)傳送門:Git子模塊),或者對(duì)于一些不會(huì)頻繁維護(hù)的模塊,直接打包成aar上傳到maven倉(cāng)庫(kù)也是可以的。
子模塊的簡(jiǎn)單介紹:Git支持在主倉(cāng)庫(kù)中引用其它獨(dú)立倉(cāng)庫(kù),這些在倉(cāng)庫(kù)中引入的其它倉(cāng)庫(kù)被稱為子模塊。子模塊同正常的GIt倉(cāng)庫(kù)一樣,能夠獨(dú)立的進(jìn)行版本維護(hù),而主倉(cāng)庫(kù)只需要索引子模塊commit的MD5值,不用維護(hù)子模塊的文件,對(duì)降低項(xiàng)目耦合度是一個(gè)非常不錯(cuò)的手段。
凡是有利就有弊,模塊化開發(fā)雖然能夠?qū)㈨?xiàng)目解耦成不同的模塊,但是也有一些明顯的弊端:
其一、項(xiàng)目的維護(hù)成本增加。原本一個(gè)倉(cāng)庫(kù)就能解決的事情,現(xiàn)在要細(xì)分到多個(gè)倉(cāng)庫(kù),越是細(xì)小顆粒度的模塊化,維護(hù)成本越高。在小團(tuán)隊(duì)甚至個(gè)人開發(fā)的時(shí)候,是否采用模塊化的開發(fā)方案是一個(gè)需要慎重考慮的問題。
其二、跨模塊依賴變得復(fù)雜。因?yàn)橥?jí)模塊之間不直接進(jìn)行依賴,所以跨模塊調(diào)用的問題比單一模塊要復(fù)雜上許多。
歡迎點(diǎn)贊關(guān)注~