最近在重構(gòu)公司的一個項目屡穗,準備把項目進行模塊化,順便記錄一下在重構(gòu)過程中的一些感想枣氧。 ?
Android模塊化設計方案系列文章:
Android發(fā)展到現(xiàn)在擒权,關于各種模塊化開發(fā)的文章不勝枚舉缚陷,盡管有很多珠玉在前,但我還想記錄一下我對模塊化開發(fā)的的一些想法铁坎,算是對自己學習過程的一個總結(jié)和肯定蜂奸。
關于模塊化開發(fā)的優(yōu)勢,網(wǎng)上有很多介紹硬萍,這里就不再贅述了扩所,直接上圖。
上圖是我對模塊化設計的一個觀點襟铭,下面解釋一下各個模塊的意義:
實線箭頭:依賴關系
虛線箭頭:派生關系
App ①碌奉、App ②:這兩個最頂層的模塊就是我們打包app時候的殼工程短曾,模塊中不包含具體的業(yè)務邏輯。
ModuleA赐劣、ModuleB...:把項目主體功能拆分成的能各自獨立運行的模塊嫉拐,比如購物城功能、用戶信息管理等魁兼,這些模塊之間關聯(lián)不是那么緊密婉徘,在協(xié)作開發(fā)過程中,也往往不是同一個人負責咐汞,拆分成不同的模塊也能在協(xié)作開發(fā)的過程中盖呼,把相互間的干擾降到最低,提高協(xié)作開發(fā)的效率化撕。
Router:路由組件几晤,無需贅言。
ApiA植阴、ApiB...:對應的ModuleA蟹瘾、ModuleB中對外暴露出的接口、實體類掠手、路由表等憾朴。在我們開發(fā)過程中,雖然盡最大可能的避免模塊間的耦合喷鸽,但是夸模塊的調(diào)用始終無法避免众雷,為了解決需要跨模塊調(diào)用的接口、實體類等下沉到Common中導致Common臃腫的問題做祝,通過對類的api化砾省,從module中派生出對應的api模塊,提供給其他模塊依賴剖淀。
Business Common:與項目相關的基礎依賴庫纯蛾,主要用于存放模塊間共享的資源,比如TitleBar纵隔,NavigateBar等翻诉,這些widget或者資源文件與我們的業(yè)務息息相關,又在多個模塊中需要使用捌刮,于是用單獨的模塊進行管理碰煌。
ThridLibs:第三方類庫我們在開發(fā)過程中不可避免的會使用到第三方類庫,比如分享绅作,地圖芦圾,編解碼等模塊,這些模塊的核心功能與業(yè)務關聯(lián)不大俄认,因此我們在對三方類庫進行封裝之后放入單獨的模塊个少,并把需要暴露的方法抽象成接口洪乍,供上層模塊調(diào)用。
ThridLibs Proxy:第三方類庫的代理模塊夜焦,是為了避免直接使用三方類庫壳澳,對上面的那個模塊抽象出來的接口進行動態(tài)/靜態(tài)代理,方便我們以后敏捷的對三方類庫進行更改茫经。
Base Common:與業(yè)務無關的基礎模塊巷波,比如我們封裝的BaseActivity、BaseFragment等卸伞,我們可以把這個類庫用到其他的項目中抹镊,也是我們在開發(fā)中的基礎沉淀。
Utils:這個模塊比較簡單荤傲,就是日常中用到的一些工具類垮耳,比如FileUtil、AppUtil等遂黍。
這些module可以Git子模塊的形式存在于住項目之中的(還不了解子模塊的同學請進傳送門:Git子模塊)氨菇,或者對于一些不會頻繁維護的模塊,直接打包成aar上傳到maven倉庫也是可以的妓湘。
子模塊的簡單介紹:Git支持在主倉庫中引用其它獨立倉庫,這些在倉庫中引入的其它倉庫被稱為子模塊乌询。子模塊同正常的GIt倉庫一樣榜贴,能夠獨立的進行版本維護,而主倉庫只需要索引子模塊commit的MD5值妹田,不用維護子模塊的文件唬党,對降低項目耦合度是一個非常不錯的手段。
凡是有利就有弊鬼佣,模塊化開發(fā)雖然能夠?qū)㈨椖拷怦畛刹煌哪K驶拱,但是也有一些明顯的弊端:
其一、項目的維護成本增加晶衷。原本一個倉庫就能解決的事情蓝纲,現(xiàn)在要細分到多個倉庫,越是細小顆粒度的模塊化晌纫,維護成本越高税迷。在小團隊甚至個人開發(fā)的時候,是否采用模塊化的開發(fā)方案是一個需要慎重考慮的問題锹漱。
其二箭养、跨模塊依賴變得復雜。因為同級模塊之間不直接進行依賴哥牍,所以跨模塊調(diào)用的問題比單一模塊要復雜上許多毕泌。
歡迎點贊關注~