27.組件化項(xiàng)目結(jié)構(gòu)搭建

一.組件化簡(jiǎn)介

注:組件化開發(fā)只適用于大型團(tuán)隊(duì)協(xié)作開發(fā)大型項(xiàng)目的場(chǎng)景酿愧,如果只是個(gè)人或者兩三人開發(fā)則沒有必要使用

什么是組件化

業(yè)務(wù)按照功能劃分為一個(gè)一個(gè)模塊,模塊之間沒有依賴關(guān)系偎巢,相互平行顽馋,模塊之間的通信通過一定技術(shù)手段實(shí)現(xiàn)的開發(fā)方式就叫組件化

為什么需要組件化皱碘?

傳統(tǒng)的開發(fā)方式:多人協(xié)作開發(fā)同一個(gè)項(xiàng)目,代碼雜亂不易管理均唉,并且多個(gè)功能之間依賴程度較高是晨,無法做到按功能分組來打包提測(cè),必須同步進(jìn)行舔箭,有可能開發(fā)周期較短的功能需要等待開發(fā)周期較長(zhǎng)的功能罩缴,效率較低

組件化開發(fā)方式:各功能之間互不影響,獨(dú)立進(jìn)行层扶,并且可以實(shí)現(xiàn)單獨(dú)模塊打包箫章,一個(gè)模塊的進(jìn)度不會(huì)影響到另一個(gè)模塊的進(jìn)展,有效的提高了開發(fā)測(cè)試的效率镜会,代碼結(jié)構(gòu)清晰檬寂,便于管理。

組件化的實(shí)現(xiàn)方式

上邊提到組件化各模塊之間相互不允許有依賴關(guān)系稚叹,那么模塊之間的通信方式就是一個(gè)需要首先解決的問題焰薄。通常來說實(shí)現(xiàn)方式有下面幾種:

1.EventBus(每一個(gè)消息傳遞都需要一個(gè)獨(dú)立的EventBean,維護(hù)成本太高)
2.廣播 (不好管理,都統(tǒng)一發(fā)出去了)
3.使用隱士意圖方式(在AndroidManifest.xml里面配置xml寫的太多了)
4.使用類加載方式 (除了容易寫錯(cuò)包名類名之外扒袖,其他缺點(diǎn)較少)
5.使用全局Map的方式(要在Application中注冊(cè)很多的對(duì)象塞茅,太費(fèi)事)
6.ARouter目前應(yīng)用最廣的方式 ARouter

ARouter由阿里巴巴開源(https://github.com/alibaba/ARouter)

二.這篇文章不去關(guān)注如何使用ARouter,而是重點(diǎn)放在組件化基礎(chǔ)配置的搭建上

1.實(shí)現(xiàn)組件獨(dú)立打包

既然是搭建組件化項(xiàng)目,那么首先我們要分出幾個(gè)功能模塊來!創(chuàng)建一個(gè)工程季率,app為項(xiàng)目主模塊野瘦,然后創(chuàng)建另外三個(gè)Module:home,mine飒泻,news鞭光,最后創(chuàng)建一個(gè)Library庫作為最底層的基礎(chǔ)庫

截屏2021-01-10 上午8.53.22.png

他們的依賴關(guān)系是這樣的

app

implementation project(':mine')
implementation project(':home')
implementation project(':news')

mine

implementation project(':library')

home

implementation project(':library')

news

implementation project(':library')

創(chuàng)建一個(gè)common.gradle文件做全局的一些配置


截屏2021-01-10 上午9.05.27.png

然后在項(xiàng)目根目錄的build.gradle中引入這個(gè)文件


截屏2021-01-10 上午9.06.12.png

common.gradle

ext {
    isRelease = true
}

定義一個(gè)isRelease變量來作為項(xiàng)目的環(huán)境配置,我們要實(shí)現(xiàn)泞遗,線上環(huán)境打包把所有模塊都打進(jìn)去惰许,測(cè)試環(huán)境打包可以指定模塊單獨(dú)打包

那么怎么實(shí)現(xiàn)呢?

我們知道史辙,每個(gè)module要單獨(dú)能夠打包的話汹买,他就必須有這樣一個(gè)配置佩伤,也就是說它必須是一個(gè)module而不是一個(gè)library

apply plugin: 'com.android.application'

那么我們就可以通過isRelease這個(gè)變量來if else判斷了,我們?cè)诿總€(gè)組件的build.gradle文件頂部配置如下:

if (isRelease) {
    apply plugin :'com.android.library'
} else {
    apply plugin: 'com.android.application'
}

android {
    ...
    defaultConfig {
        if (!isRelease) {  // 能夠獨(dú)立運(yùn)行 必須要有applicationId
            applicationId "com.renzhenming.xxxx"
        }
        ....
    }
}

也就是說release環(huán)境下晦毙,這個(gè)組件作為library被app依賴生巡,debug環(huán)境下,這個(gè)組件是一個(gè)單獨(dú)的module见妒,可以實(shí)現(xiàn)獨(dú)立打包孤荣。這樣一來我們mine home news 三個(gè)module下都配置好了

然后在app build.gradle下配置如下,只有release環(huán)境下才去依賴三個(gè)library

dependencies {
    ...
    if (isRelease){
        implementation project(':mine')
        implementation project(':home')
        implementation project(':news')
    }
}

如此,只是通過改變common.gradle文件中的isRelease字段的值就可以控制是否進(jìn)行模塊打包了须揣,我們將isRelease設(shè)置為false盐股,然后編譯下看看,可以看到home,mine返敬,news三個(gè)組件可以單獨(dú)打包了


截屏2021-01-10 上午9.17.13.png

然后把isRelease設(shè)置為true再次編譯


截屏2021-01-10 上午9.18.48.png

2.組件獨(dú)立打包如何運(yùn)行

僅僅是獨(dú)立打包是不行的遂庄,總要有一個(gè)啟動(dòng)的Activity吧,但是這個(gè)Activity在release環(huán)境下又不能讓他起作用劲赠,也就是不能在組件的AndroidManifest中配置,那么我們是不是可以指定一個(gè)debug環(huán)境下的AndroidManifest文件呢秸谢?

當(dāng)然是可以的凛澎,我們?cè)诿總€(gè)組件的src/main下創(chuàng)建一個(gè)debug目錄和一個(gè)AndroidManifest,在這里指定LAUNCHER Activity


截屏2021-01-10 上午9.33.29.png

在這個(gè)組件的build.gradle下配置debug環(huán)境時(shí)文件AndroidManifest的目錄指向我們創(chuàng)建的這個(gè)AndroidManifest

android {
    ...
    sourceSets {
        main {
            if (!isRelease) {
                // 如果是組件化模式
                manifest.srcFile 'src/main/debug/AndroidManifest.xml' // 生效
            } else { // 正式環(huán)境下
                manifest.srcFile 'src/main/AndroidManifest.xml' // 讓我們之前 默認(rèn)的路徑下的清單文件再次生xiao
            }
        }
    }
}

但是有一個(gè)問題估蹄,這個(gè)debug目錄既然時(shí)測(cè)試環(huán)境打包用的塑煎,release環(huán)境我們肯定不希望它的代碼被打進(jìn)包里去,那么release的時(shí)候我們就要把這個(gè)目錄移除臭蚁,添加一行配置

android {
    ...
    sourceSets {
        main {
            if (!isRelease) {
                // 如果是組件化模式
                manifest.srcFile 'src/main/debug/AndroidManifest.xml' // 生效
            } else { // 正式環(huán)境下
                manifest.srcFile 'src/main/AndroidManifest.xml' // 讓我們之前 默認(rèn)的路徑下的清單文件再次生xiao
                java {
                    // release 時(shí) debug 目錄下文件不需要合并到主工程
                    exclude "**/debug/**"
                }
            }
        }
    }
}

這樣一來最铁,組件化的基礎(chǔ)配置就完成了,下篇文章正式進(jìn)入APT技術(shù)和JavaPoet的使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垮兑,一起剝皮案震驚了整個(gè)濱河市冷尉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌系枪,老刑警劉巖雀哨,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異私爷,居然都是意外死亡雾棺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門衬浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌浩,“玉大人,你說我怎么就攤上這事工秩∈龋” “怎么了进统?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侵佃。 經(jīng)常有香客問我麻昼,道長(zhǎng),這世上最難降的妖魔是什么馋辈? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任抚芦,我火速辦了婚禮,結(jié)果婚禮上迈螟,老公的妹妹穿的比我還像新娘叉抡。我一直安慰自己,他們只是感情好答毫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布褥民。 她就那樣靜靜地躺著,像睡著了一般洗搂。 火紅的嫁衣襯著肌膚如雪消返。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天耘拇,我揣著相機(jī)與錄音撵颊,去河邊找鬼。 笑死惫叛,一個(gè)胖子當(dāng)著我的面吹牛倡勇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘉涌,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼妻熊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仑最?” 一聲冷哼從身側(cè)響起扔役,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎词身,沒想到半個(gè)月后厅目,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡法严,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年损敷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深啤。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拗馒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溯街,到底是詐尸還是另有隱情诱桂,我是刑警寧澤洋丐,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挥等,受9級(jí)特大地震影響友绝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肝劲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一迁客、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辞槐,春花似錦掷漱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹿榜,卻和暖如春海雪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舱殿。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工喳魏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怀薛。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迷郑,于是被迫代替她去往敵國(guó)和親枝恋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355