一、為什么要組件化蔬将?組件化有哪些好處?
網(wǎng)上提到的組件化的好處有很多央星,這里我就僅列舉幾個比較明顯的好處霞怀。
1.代碼隔離,實現(xiàn)被動解耦
情景a 小王想實現(xiàn)一個右上角有“X”號的dialog莉给,但是他發(fā)現(xiàn)基礎(chǔ)UI庫里dialog沒有這個按鈕毙石,于是小王想偷偷在基礎(chǔ)組件庫里寫一個tag,用于標記dialog是否右上角有“X”號颓遏。
(組件化前)小王偷偷寫入成功徐矩,大家紛紛效仿小王,最后基礎(chǔ)庫里的dialog一共有十幾處tag用于標記狀態(tài)叁幢。后來滤灯,UI大改版,大家發(fā)現(xiàn)這個dialog代碼過于復(fù)雜只能重構(gòu)。
(組件化后)小王發(fā)現(xiàn)基礎(chǔ)庫的代碼是遠程依賴鳞骤,自己并沒有修改權(quán)限,只好作罷窒百。他通過繼承的方式,寫了一個屬于自己模塊的dialog豫尽。
情景b: 小張是一個邋遢的人篙梢,他寫代碼從不一口氣寫完。有一天美旧,小張重構(gòu)了BaseFragment渤滞,但是他寫了一半,項目無法編譯就提交了,而且他還請了十天的假榴嗅。
(組件化前) 項目組正在緊急修復(fù)一個bug蔼水,但是發(fā)現(xiàn)怎么也無法編譯成功。經(jīng)查录肯,是小張改了BaseFragment趴腋,改的異常復(fù)雜,大家還不敢修復(fù)论咏,然后又聯(lián)系不到小張优炬。最終導(dǎo)致項目delay了一個星期。
(組件化后) 項目組一直依賴的是maven庫的上版release包厅贪,base庫雖然代碼不能編譯蠢护,但是app并不直接依賴源碼。項目正常推進养涮。
情景c: 小李和小王分別在開發(fā)兩個模塊葵硕,小李發(fā)現(xiàn)小王im聊天類寫的非常的出色,所以準備直接引用小王寫的類贯吓。但是小王準備對該模塊進行升級
(組件化前)兩人都愉快的開發(fā)懈凹,直到上線的那天,小李發(fā)現(xiàn)自己im消息加載不出來頭像悄谐,于是他甩鍋給小王介评。后來兩人為此鬧的不可開交。
(組件化后)im屬于基礎(chǔ)組件爬舰,要求所有暴露在外的接口必須保持不變们陆。小王升級了組件以后,對小李沒有任何影響情屹。
2.工程有了層次感坪仇,更容易找到自己的“一畝三分地”
情景a:小劉是一個新來的同學,他接到一個需求垃你,說要給視頻直播間加一個dialog椅文。
(組件化前)小劉一頓操作颈墅,給直播間一個按鈕加了一個dialog,但他不知道音頻直播間也在用這個模塊雾袱,后來線上出現(xiàn)了大批崩潰恤筛。
(組件化后)小劉通過名字迅速找到了LiveComponent模塊,因為AudioLiveComponent是另外一個模塊芹橡,所以修改了并沒有產(chǎn)生影響毒坛。
3.組件化后的模塊就像擺在貨架的商品,其他app也可以快速集成使用
情景a:A公司日益壯大林说,一個App已經(jīng)無法滿足公司的雄心壯志煎殷,A公司決定要寫一個新的以直播為導(dǎo)向的app
(組件化前)程序員們開始瘋狂從原有的app上復(fù)制代碼。從基礎(chǔ)框架腿箩、網(wǎng)絡(luò)請求豪直、圖片加載 到 數(shù)據(jù)庫、原子參數(shù)珠移。后來服務(wù)端決定對接口進行升級弓乙,程序員們又開始一個一個項目的修改代碼
(組件化后)程序員只參照文檔 一行g(shù)radle一個組件,迅速搭建了app架子钧惧。服務(wù)端進行接口升級后暇韧,各app僅僅把自己依賴的版本號進行升級,就完成了整個app網(wǎng)絡(luò)請求的改造浓瞪。
二懈玻、組件化長什么樣子?有哪些規(guī)范乾颁?
1.組件化一般分為:
App殼:不參雜任何邏輯涂乌,只是把各個業(yè)務(wù)組件整合在一起。
業(yè)務(wù)組件層:承擔業(yè)務(wù)功能英岭,不可復(fù)用湾盒,程序員日常迭代的地方。
功能組件層:封裝一些基本的功能巴席,包括日志历涝、分享诅需、登錄等漾唉。一般不進行修改,供上層業(yè)務(wù)調(diào)用堰塌。
基礎(chǔ)庫:非痴孕蹋基礎(chǔ)的庫,能干的事情較單一场刑,并且不承擔任何業(yè)務(wù)邏輯般此。
下圖以類似“美團app”為例
注意:圖中的依賴關(guān)系是自上而下的蚪战,同級之間禁止依賴。
2.那組件化的代碼又是什么樣子呢铐懊?以為做的個人app為例
我的項目中有:大廳邀桑、直播、彩票等上層模塊科乎。接下來是網(wǎng)絡(luò)請求壁畸、基礎(chǔ)base架構(gòu)模塊。他的文件結(jié)構(gòu)是這樣的
項目是不是看起來清新又直白茅茂。這就是組件化的魅力捏萍。
三、利用阿里云效搭建自己的組件庫
0.創(chuàng)建一個組件
a:通過Androidstudio可以為我們自動創(chuàng)建一個組件空闲。
b:我們一般選擇Android library
c:然后起一個名字令杈,模塊名我比較喜歡加Component(為了和基礎(chǔ)組件區(qū)分),包名則省略這個后綴碴倾。
d:然后我們重新build一下逗噩,新模塊就建立好啦,模塊有一個三道杠的標示跌榔。
1.進入阿里云效给赞,選擇制品倉庫,選擇maven倉庫矫户。
根據(jù)提示配置gradle
步驟一:請在build.gradle中設(shè)置倉庫的訪問憑證片迅。
group '[GROUP_ID]'
version '[VERSION]'
def artifactId = '[ARTIFACT_ID]'
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
repository(url: 'xxxxx') {
authentication(
userName: '***',
password: '***'
)
}
snapshotRepository(url: 'xxxxx') {
authentication(
userName: '***',
password: '***'
)
}
pom.version = '$project.version'
pom.artifactId = '$artifactId'
pom.groupId = '$project.group'
}
}
}
步驟二:設(shè)置倉庫下載配置
配置
allprojects {
repositories {
maven {
url 'https://maven.aliyun.com/repository/public'
}
maven {
credentials {
username '***'
password '***'
}
url 'xxxx'
}
maven {
credentials {
username '***'
password '***'
}
url 'xxxx'
}
}
}
但是我不聽他們的建議,這邊我介紹一種比較方便的配置方法:
在模塊的build.gradle里加入
ext {
isRelease = false
componentVersion = '0.0.1'
}
在下面的任意地方加入(因為gradle是按順序編譯的皆辽,引用必須要放在ext之下)
apply from: "publish.gradle"
這項目文件夾下創(chuàng)建一個publish.gradle
apply plugin: 'maven-publish'
publishing {
publications {
debug(MavenPublication) {
groupId maven_component_groupId //gradle.properties里寫入對應(yīng)的值
artifactId [project.name](http://project.name/)
version "${isRelease ? componentVersion : "${componentVersion}-SNAPSHOT"}"
artifact("$buildDir/aar/${[project.name](http://project.name/)}-debug.aar")
}
}
repositories {
maven {
url "${isRelease ? maven_release_repo : maven_snapshots_repo}" //gradle.properties里寫入對應(yīng)的值
credentials {
username maven_user //gradle.properties里寫入對應(yīng)的值
password maven_password //gradle.properties里寫入對應(yīng)的值
}
}
}
}
這樣柑蛇,我們每次升級版本的時候,只用修改對應(yīng)模塊build.gradle里版本號就ok了
然后我們依次執(zhí)行下面兩行命令,將模塊推送到遠端:
./gradlew :MusicComponent:build
./gradlew :MusicComponent:publish
然后我們在引用模塊的時候驱闷,只需要在上層模塊build.gradle
implementation "${maven_component_groupId}:MusicComponent:0.0.1-SNAPSHOT"
這樣我們就實現(xiàn)了遠程依賴耻台。接下來,我們只要一步一步更改版本號就可以完成組件升級空另。