1. 什么是組件化開發(fā)呢?
在項(xiàng)目開發(fā)中,會(huì)將公用的代碼提取出來(lái)制作基礎(chǔ)庫(kù)Base Module,將某些單獨(dú)的功能封裝到Library module中,更具業(yè)務(wù)來(lái)劃分module。
組件:指的是單一的功能組件,如視頻組件(VideoSDK)、支付組件(PaySDK)、路由組件(Router)等,每個(gè)組件都能單獨(dú)抽出來(lái)制作成SDK。
模塊:指的是業(yè)務(wù)模塊(LiveModule)、首頁(yè)模塊(HomeModule)、即時(shí)通信模塊(IMModule)等。模塊相對(duì)于組件來(lái)說(shuō)粒度更大,模塊可能包含多種不同的組件。
1.1 組件化開發(fā)有什么好處?
1)避免重復(fù)造輪子,可以節(jié)省開發(fā)和維護(hù)的成本。
2)可以通過(guò)組件和模塊為業(yè)務(wù)基準(zhǔn)合理地安排人力,提高開發(fā)效率。
3)不同的項(xiàng)目可以公用一個(gè)組件或模塊,確保整體技術(shù)方案的一致性。
4)為未來(lái)插件化共用一套底層模型做準(zhǔn)備。
1.2 模塊化開發(fā)的好處?
1)業(yè)務(wù)模塊解耦,業(yè)務(wù)移植更加簡(jiǎn)單。
2)多團(tuán)隊(duì)根據(jù)業(yè)務(wù)內(nèi)容進(jìn)行并行開發(fā)和測(cè)試。
3)單個(gè)業(yè)務(wù)可以單獨(dú)編譯打包,加快編譯速度。
4)多個(gè)app共用模塊,降低了研發(fā)和維護(hù)的成本。
??組件化和模塊化都是為了代碼重用和業(yè)務(wù)解耦。區(qū)別在于模塊化是業(yè)務(wù)導(dǎo)向,組件化是功能導(dǎo)向。
??項(xiàng)目體積越來(lái)越大后,必定會(huì)有超過(guò)65536的一天,要么選擇multidex的方式分包解決,要么使用插件化的方式來(lái)完成項(xiàng)目。
??組件化和模塊化的劃分可以更好地為項(xiàng)目插件化開路,插件化的模塊化發(fā)布和正常發(fā)布有著非常大的差異,已經(jīng)脫離了組件化和模塊化的構(gòu)建機(jī)制,插件化擁有更高效的業(yè)務(wù)解耦。
1.1.3 基礎(chǔ)組件架構(gòu)介紹
分為應(yīng)用層、組件層和基礎(chǔ)層。
1)基礎(chǔ)層:包含一些基礎(chǔ)庫(kù)和對(duì)基礎(chǔ)庫(kù)的封裝,包括圖片加載、網(wǎng)絡(luò)加載、數(shù)據(jù)存儲(chǔ)等。
2)組件層:包含一些簡(jiǎn)單的業(yè)務(wù),比如登陸、數(shù)據(jù)觀看、圖片瀏覽等。
3)應(yīng)用層用于統(tǒng)籌全部組件,并輸出生成app。
1.2.1 依賴
??Android Studio 獨(dú)有設(shè)計(jì)—— module依賴。
??module 的依賴包括對(duì)第三方庫(kù)的依賴,也包含對(duì)其他module的依賴。通過(guò)依賴我們可以訪問(wèn)第三方和其他被依賴Module的代碼和資源。
三種基本的依賴方式:
1)Jar dependency:通過(guò)Gradle配置引入lib文件夾中的所有.jar后綴的文件,還能引用.aar后綴的文件。
2)Base module:相當(dāng)于一個(gè)基礎(chǔ)模塊庫(kù)(lib module)來(lái)作為依賴,對(duì)應(yīng)的是module dependency,實(shí)質(zhì)上是將其打包成aar文件,方便其他庫(kù)進(jìn)行依賴。
3)第三方依賴通過(guò)library dependency 完成倉(cāng)庫(kù)索引依賴,這里的倉(cāng)庫(kù)可以配置為網(wǎng)絡(luò)庫(kù)和本地庫(kù)。
1.2.2 聚合和解耦合
依賴 -> 關(guān)系
??有了依賴才能產(chǎn)生關(guān)系。一個(gè)工程體系我們可以想象成一個(gè)群體,如果一個(gè)群體中的每個(gè)個(gè)體彼此都非常陌生,沒(méi)有溝通,沒(méi)有關(guān)系,那么將無(wú)法發(fā)揮每個(gè)個(gè)體的最大能力,所以我們需要為個(gè)體提供溝通交流的渠道。
??我們?cè)趯?shí)踐中也應(yīng)當(dāng)為替換或移除某個(gè)個(gè)體的行為付出最少代價(jià)的方案。
關(guān)系 -> 解耦
??既然需要解耦,需要設(shè)計(jì)更加適合交流溝通的系統(tǒng),也可以考慮為一個(gè)群體設(shè)計(jì)更加適合的交流溝通的方式。
??聚合和解耦是項(xiàng)目架構(gòu)的基礎(chǔ)。架構(gòu)工程就是一個(gè)群體集合,如何讓每個(gè)個(gè)體產(chǎn)生最大的作用;如何讓個(gè)體間的交流通暢來(lái)如何讓每個(gè)個(gè)體付出最小的消耗來(lái)完成任務(wù),并獲得最大的集體利益;如何統(tǒng)籌更大規(guī)模的集體。
1.3 重新認(rèn)識(shí) AndroidManifest
??由于每個(gè)工程都會(huì)接觸到AndroidManifest.xml項(xiàng)目配置文件,說(shuō)明了其重要性。每個(gè)module都有一份配合的AndroidManifest文件來(lái)記載其信息,最終生成一個(gè)APP的時(shí)候,如何記錄多個(gè)module獨(dú)立的配置信息呢?答案就是將多個(gè)AndroidManifest合成一個(gè),那么沖突將如何解決呢?
??首先,Application module(主工程)依賴多個(gè)lib module(功能module)如下:
dependencies {
compile project(':news')
compile project(':web')
compile project(':submit')
annotationProcessor 'com.alibaba:arouter-compiler:1.1.1'
}
??當(dāng)編譯主module時(shí)會(huì)將這些功能module重新編譯,然后將成果(aar)放到主module的intermidates文件夾中
。。。待續(xù)