Android組件化實踐

一、為什么要組件化蔬将?組件化有哪些好處?

網(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”為例


想象中的美團app架構(gòu)

注意:圖中的依賴關(guān)系是自上而下的蚪战,同級之間禁止依賴。

2.那組件化的代碼又是什么樣子呢铐懊?以為做的個人app為例

我的項目中有:大廳邀桑、直播、彩票等上層模塊科乎。接下來是網(wǎng)絡(luò)請求壁畸、基礎(chǔ)base架構(gòu)模塊。他的文件結(jié)構(gòu)是這樣的


我自己的app文件架構(gòu)

項目是不是看起來清新又直白茅茂。這就是組件化的魅力捏萍。

三、利用阿里云效搭建自己的組件庫

0.創(chuàng)建一個組件

a:通過Androidstudio可以為我們自動創(chuàng)建一個組件空闲。


第一步:創(chuàng)建module

b:我們一般選擇Android library

第二步:創(chuàng)建一個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)了遠程依賴耻台。接下來,我們只要一步一步更改版本號就可以完成組件升級空另。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盆耽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扼菠,更是在濱河造成了極大的恐慌摄杂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件循榆,死亡現(xiàn)場離奇詭異析恢,居然都是意外死亡,警方通過查閱死者的電腦和手機秧饮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門映挂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泽篮,“玉大人,你說我怎么就攤上這事柑船∶背牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵鞍时,是天一觀的道長油狂。 經(jīng)常有香客問我,道長寸癌,這世上最難降的妖魔是什么专筷? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蒸苇,結(jié)果婚禮上磷蛹,老公的妹妹穿的比我還像新娘。我一直安慰自己溪烤,他們只是感情好味咳,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檬嘀,像睡著了一般槽驶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸳兽,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天掂铐,我揣著相機與錄音,去河邊找鬼揍异。 笑死全陨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的衷掷。 我是一名探鬼主播辱姨,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戚嗅!你這毒婦竟也來了雨涛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤懦胞,失蹤者是張志新(化名)和其女友劉穎替久,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體医瘫,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡侣肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醇份。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稼锅。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖僚纷,靈堂內(nèi)的尸體忽然破棺而出矩距,到底是詐尸還是另有隱情,我是刑警寧澤怖竭,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布锥债,位于F島的核電站,受9級特大地震影響痊臭,放射性物質(zhì)發(fā)生泄漏哮肚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一广匙、第九天 我趴在偏房一處隱蔽的房頂上張望允趟。 院中可真熱鬧,春花似錦鸦致、人聲如沸潮剪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抗碰。三九已至,卻和暖如春绽乔,著一層夾襖步出監(jiān)牢的瞬間弧蝇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工折砸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捍壤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓鞍爱,卻偏偏與公主長得像鹃觉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睹逃,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 0 背景 早前嚴選 Android 工程盗扇,業(yè)務(wù)模塊和功能模塊不多,工程較為簡單沉填,全部的業(yè)務(wù)代碼均在主 app 工程...
    zyl06閱讀 6,194評論 10 54
  • 引子 一般情況下疗隶,一個 Android 項目,隨著業(yè)務(wù)的發(fā)展和擴張翼闹,會有許多 Activity斑鼻、Fragment ...
    修之竹閱讀 1,371評論 2 4
  • 編譯時間越來越長,時間=生命猎荠,我要救命坚弱。 項目框架 最開始項目只有一個app蜀备,項目結(jié)構(gòu)很簡單,就是一個業(yè)務(wù)modu...
    展翅而飛閱讀 4,495評論 5 18
  • 一荒叶、背景 隨著APP版本不斷的迭代碾阁,新功能的不斷增加,業(yè)務(wù)也會變的越來越復(fù)雜些楣,APP業(yè)務(wù)模塊的數(shù)量有可能還會繼續(xù)增...
    please邊去閱讀 539評論 0 1
  • 前言 相信各位小伙伴們對組件化開發(fā)都不陌生了,本文只對我所理解和使用的組件化開發(fā)方案做一個總結(jié),有不正確或者需要改...
    小豪丶ace閱讀 587評論 0 2