android組件化之路

問題:實(shí)際業(yè)務(wù)變化快,而工程內(nèi)各個(gè)功能模塊耦合度太高哥桥,不能對功能模塊進(jìn)行快速方便地拆分或組裝拟糕。團(tuán)隊(duì)共同開發(fā)中倦踢,可能一個(gè)文件同時(shí)被多人修改辱挥,導(dǎo)致每次更新提交代碼都需要消耗大量時(shí)間去merge代碼。每次修改褂微,都需要進(jìn)行功能測試和系統(tǒng)測試宠蚂。

目的:解決以上問題求厕,使項(xiàng)目可以靈活配置,功能模塊完全解耦旅东,實(shí)踐組件化之路抵代。

實(shí)現(xiàn):在之前的開發(fā)中忘嫉,一個(gè)應(yīng)用程序庆冕,我們將全部功能模塊都寫在工程app包中。實(shí)踐組件化晦嵌,我們將各個(gè)功能模塊獨(dú)立出來惭载,最終以依賴包的形式整合到app主Module中去响巢。在這里我寫了個(gè)項(xiàng)目demo,簡單分了幾個(gè)功能模塊含长,應(yīng)用結(jié)構(gòu)如下圖所示:

項(xiàng)目組件化結(jié)構(gòu)圖

說明:每一個(gè)組件module是一個(gè)子工程拘泞,子工程可以依賴基礎(chǔ)庫baselibrary可獨(dú)立運(yùn)行陪腌;也可以作為主工程的依賴庫铡原。

具體實(shí)現(xiàn):1:配置項(xiàng)目的buildscript,如下圖所示:

buildscript配置

關(guān)于butterknife的配置及用法:http://jakewharton.github.io/butterknife,butterknife8支持在lib庫中注解卵洗。

2:在主app module gradle中如下配置:

applyplugin:'com.android.application'

applyplugin:'android-apt'

android {

? ? compileSdkVersion COMPILE_SDK_VERSION as int

? ? buildToolsVersion BUILD_TOOLS_VERSION

? ? defaultConfig {

? ? ? ? applicationId APPLICATION_ID

? ? ? ? minSdkVersion MIN_SDK_VERSIONas int

? ? ? ? targetSdkVersion TARGET_SDK_VERSIONas int

? ? ? ? versionCode 1

? ? ? ? versionName "1.0"

? ? }

? ? signingConfigs {

? ? ? ? debugConfig {

? ? ? ? ? ? storeFile file("***.jks")

? ? ? ? ? ? storePassword "******"

? ? ? ? ? ? keyAlias "*****"

? ? ? ? ? ? keyPassword "******"

? ? ? ? }

? ? releaseConfig {

? ? ? ? storeFile file("******.jks")

? ? ? ? storePassword "********"

? ? ? ? keyAlias "*****"

? ? ? ? keyPassword"*******"

? ? }

}

}

?buildTypes {

? ? ? ?release {

? ? ? ? ?minifyEnabled false

? ? ? ? ?proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

? ? ?}

? }

dependencies {

if(!isDebug.toBoolean()) {//各個(gè)模塊作為庫加載

compile project(':loginmodule')

compile project(':startmodule')

compile project(':homemodule')

compile project(':msgmodule')

}else{//各模塊獨(dú)立運(yùn)行

compile project(':baselibrary')

}

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

說明:關(guān)于activityrouter的配置及使用十绑,在后面會(huì)說到本橙。

3:baselibrary作為各個(gè)模塊共同依賴的基礎(chǔ)庫脆诉,其gradle配置如下:

applyplugin:'com.android.library'

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

}

buildTypes {

release {

minifyEnabledfalse

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(include: ['*.jar'],dir:'libs')

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile'com.android.support:appcompat-v7:24.2.1'

compile'com.jakewharton:butterknife:8.5.1'

apt'com.jakewharton:butterknife-compiler:8.5.1'

compile'com.github.mzule.activityrouter:activityrouter:1.2.2'

}

4:在子工程模塊gradle配置如下(以homemodule為例):

if(isDebug.toBoolean()) {

applyplugin:'com.android.application'

}else{

applyplugin:'com.android.library'

}

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabledfalse

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

sourceSets {

main{

if(isDebug.toBoolean()) {

manifest.srcFile'src/debug/AndroidManifest.xml'

}else{

manifest.srcFile'src/release/AndroidManifest.xml'

}

}

}

resourcePrefix"home_"

}

dependencies {

compile fileTree(dir:'libs',include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile project(':baselibrary')

apt'com.jakewharton:butterknife-compiler:8.5.1'

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

說明:當(dāng)module單獨(dú)運(yùn)行和作為module運(yùn)行時(shí)亏狰,其activity在manifest中設(shè)置也會(huì)不同暇唾,這里可以根據(jù)isDebug設(shè)置不同的manifest策州。當(dāng)分別開發(fā)模塊時(shí)宫仗,容易出資源重復(fù)命名的問題,可以在build.gradle中設(shè)置resourcePrefix "home_"下硕,通過給模塊設(shè)置不同的資源前綴梭姓,可以避免重復(fù)命名嫩码。

Activity跳轉(zhuǎn)問題

從上面的配置中,可以看到铡恕,項(xiàng)目引入了apt'com.github.mzule.activityrouter:compiler:1.1.7'探熔,我們?yōu)槭裁词褂肁ctivityRouter呢烘挫,當(dāng)我們把各個(gè)功能模塊抽成獨(dú)立的lib的時(shí)候,各個(gè)模塊之間難免要進(jìn)行Activity的跳轉(zhuǎn)及傳參苛蒲。我們不能再像以前那樣直接通過startActivity來實(shí)現(xiàn)跳轉(zhuǎn)了绿满。關(guān)于ActivityRouter的配置及用法:https://github.com/mzule/ActivityRouter

使用在application中注解:@Modules({"app","homeModule","loginModule","startModule","msgModule"})

public class XxxxApplication extends Application {

}

每個(gè)module中創(chuàng)建空java類注解:

@Module("homeModule")

public class HomeModule{

}

組件間通信問題:

不同組件Activity之間傳遞大量數(shù)據(jù)時(shí)可以通過EventBus來進(jìn)行傳遞喇颁,EventBus原理及用法:https://github.com/greenrobot/EventBus

編譯運(yùn)行

當(dāng)在gradle.properties中設(shè)置isDebug=true時(shí),可以獨(dú)立運(yùn)行每個(gè)module漾肮,獨(dú)立運(yùn)行調(diào)試克懊,當(dāng)設(shè)置isDebug=false七蜘,可以編譯運(yùn)行整個(gè)project,注意isDebug變量設(shè)置改變時(shí)橡卤,要重新對gradle進(jìn)行sync。

可能遇到的一些問題:

1:如果遇到/com/github/mzule/activityrouter/router/RouterInit.java javaError:(7, 5) 錯(cuò)誤: 找不到符號(hào) 符號(hào):? 變量 RouterMapping等錯(cuò)誤柜与,請檢查app是否把各個(gè)Module都依賴進(jìn)來了弄匕。

2:使用butterknife注解時(shí)沽瞭,每個(gè)Module會(huì)對應(yīng)生成R2文件驹溃,即使在base庫里注解過了,Module也要重新注解亡哄,組件中不能直接使用磺平。

3:如果項(xiàng)目中使用到menu注意:

@Override

protected void onMenuItemClick(MenuItem item) {

//? ? ? ? switch (item.getItemId()) {

//? ? ? ? ? ? case R2.id.xxx:

//? ? ? ? ? ? ? ? Routers.open(mContext,"");

//? ? ? ? ? ? ? ? break;

//? ? ? ? }

if (item.getItemId() == R.id.xxx){

Routers.open(mContext,"");

}

super.onMenuItemClick(item);

}

尋找對應(yīng)的menu id時(shí)拐辽,用if else 代替 switch,注:itemid 和 R2值不一樣菠劝,和R是一樣的赶诊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舔痪,一起剝皮案震驚了整個(gè)濱河市锄码,隨后出現(xiàn)的幾起案子晌涕,更是在濱河造成了極大的恐慌余黎,老刑警劉巖惧财,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垮衷,死亡現(xiàn)場離奇詭異,居然都是意外死亡知给,警方通過查閱死者的電腦和手機(jī)涩赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門轩勘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人花墩,你說我怎么就攤上這事冰蘑。” “怎么了武氓?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵县恕,是天一觀的道長忠烛。 經(jīng)常有香客問我权逗,道長,這世上最難降的妖魔是什么火惊? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮椿猎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘按灶。我一直安慰自己鸯旁,他們只是感情好铺罢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布残炮。 她就那樣靜靜地躺著韭赘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪势就。 梳的紋絲不亂的頭發(fā)上泉瞻,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天脉漏,我揣著相機(jī)與錄音,去河邊找鬼袖牙。 笑死侧巨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贼陶。 我是一名探鬼主播刃泡,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巧娱,長吁一口氣:“原來是場噩夢啊……” “哼碉怔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芹啥,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤傀履,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后梆暮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡张峰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朽合。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讲婚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酵紫,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布宏邮,位于F島的核電站械筛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赤赊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一晨逝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸叔汁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至色乾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悍汛。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工宵蛀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梧宫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓埠巨,卻偏偏與公主長得像勋桶,于是被迫代替她去往敵國和親鹃锈。 傳聞我的和親對象是個(gè)殘疾皇子盆驹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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