首先逸尖,談?wù)劄槭裁匆獙戇@個系列的文章,嚴(yán)格來說是一段學(xué)習(xí)組件化的筆記瘸右。
很多小伙伴都了解組件化冷溶,也學(xué)習(xí)過,但是像我這樣沒有大型項目經(jīng)驗的尊浓,很難深入理解它的意義。直到去年公司開啟了新項目纯衍,我?guī)е?個小伙伴一起從0開發(fā)到1(當(dāng)然還有產(chǎn)品栋齿,測試及后端每個人的功勞),突破百萬日活襟诸。
隨著功能模塊越來越多瓦堵,開發(fā)人員交替,開發(fā)風(fēng)格不統(tǒng)一(有的mvp歌亲,有mvc菇用,甚至有站擼activity的),工程不僅代碼臃腫陷揪,目錄下多達(dá)38個包惋鸥。功能模塊嚴(yán)重耦合,開發(fā)中經(jīng)常引起老功能bug悍缠,或者一個bug反復(fù)出現(xiàn)(讓你不寫單元測試)卦绣。在被折磨的內(nèi)心崩潰以后,終于在組件化和單元測試中找到了救贖飞蚓。(單元測試:請看http://www.reibang.com/nb/26784460)
吐槽完畢滤港,開擼代碼,想看基礎(chǔ)的推薦這幾篇文章(是不是拿完鏈接趴拧,就可以撤了):
- 開源最佳實踐:Android平臺頁面路由框架ARouter
- 阿里ARouter開源組件化框架項目實踐
- Android組件化方案(這篇文章給出了相對完整的組件化方案溅漾,剩下的就是自己實戰(zhàn)了)
- AndroidStudio本地化配置gradle的buildToolsVersion和gradleBuildTools
目標(biāo)
首先山叮,我們的目標(biāo)是告別臃腫,建立一個業(yè)務(wù)組件之間獨立添履,即可集成開發(fā)屁倔,也可組件化開發(fā)的基礎(chǔ)項目框架。
如果是簡單的建立幾個module缝龄,那誰都會汰现,我們的項目里也有很多module。這里要解決的主要問題是:
- 組件既能獨立編譯開發(fā)叔壤,也可以集成開發(fā)僵蛛,組件間可以靈活組合打包暇榴。
- 組件之間是沒有關(guān)聯(lián)的,如何通信,頁面如何調(diào)用寄悯。(這里引入了“路由”的概念,組件間通過路由中轉(zhuǎn)建立聯(lián)系沥邻,Android用的是URL Scheme作為路由)
創(chuàng)建基礎(chǔ)工程
app:為殼工程罩润,只負(fù)責(zé)集成各個module。
lib_common:為公共基礎(chǔ)庫脚曾,引入大部分第三方庫和工具類东且。
module_setting:項目各種開關(guān),功能設(shè)置(具體什么module自己選擇)
module_main:主module本讥,暫時只有一個MainActivity珊泳。
1. 創(chuàng)建config.gradle,對所以組件的gradle配置拷沸、第三方依賴色查,統(tǒng)一管理。(關(guān)于本地化配置gradle的教程撞芍,參考開頭推薦的文章)
ext {//提取依賴秧了,版本號,方便管理
appVersion = [
versionCode: 1,
versionName: "1.0.0"
]
android = [
compileSdkVersion: 26,
minSdkVersion : 18,
targetSdkVersion : 26,
]
dependencies = [
appcompat_v7 : 'com.android.support:appcompat-v7:26.1.0',
constraintLayout : 'com.android.support.constraint:constraint-layout:1.1.1',
support_design : 'com.android.support:design:26.1.0',
support_annotations: 'com.android.support:support-annotations:26.1.0',
testJunit : 'junit:junit:4.12',
textRunner : 'com.android.support.test:runner:1.0.0',
androidTestEspresso: 'com.android.support.test.espresso:espresso-core:3.0.0',
]
}
這里api序无、implementation验毡、compile的區(qū)別需要注意,以免重復(fù)引入依賴:
implementation:編譯的依賴只作用于當(dāng)前的module
compile 與 api:二者等同帝嗡,無區(qū)別
dependencies {//module引用config.gradle的配置
implementation fileTree(dir: 'libs', include: ['*.jar'])
api rootProject.ext.dependencies.appcompat_v7
api rootProject.ext.dependencies.support_design
api rootProject.ext.dependencies.constraintLayout
2. 集成模式 和 組件化模式切換
我們需要一個開關(guān)米罚,在gradle.properties中創(chuàng)建"isModule"變量,在每個module的build.gradle中丈探,通過它來切換開發(fā)模式录择。
# false表示是集成化開發(fā)模式,true表示是組件化開發(fā)模式
isModule = true
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
那么問題來了,組件獨立編譯時隘竭,需要臨時的manifest塘秦,Application來初始化一些配置。并在集成模式下移除這些配置动看。以module_main為例:
怎么靈活的切換以上文件呢,還是要用到"isModule"菱皆,在build.gradle的android{}下须误,通過判斷isModule,加載不同的AndroidManifest.xml仇轻,并在集成模式中移除debug文件夾
android {
...
sourceSets {
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
exclude 'debug/**'
}
}
}
}
3. 公共基礎(chǔ)庫(lib_common)
作為公共的基礎(chǔ)庫京痢,除了引入依賴,還具有一下功能:
- 引入了常用的工具類篷店、公共/自定義widget祭椰,公共常量
- 第三方框架(數(shù)據(jù)庫,網(wǎng)絡(luò)疲陕,圖片方淤,RxJava等)
- permission聲明
- 一些公用的資源文件,styles蹄殃、dimens携茂、colors、drawable等等
4. app殼工程诅岩,主要功能
app殼工程邑蒋,沒有任何的業(yè)務(wù)代碼,主要用于集成模式下:
- build.gradle依賴各個組件
- 配置AndroidManifest.xml
- 聲明Android應(yīng)用的Application(繼承l(wèi)ib_common的BaseApplication)按厘。
- 配置工程混淆文件
小結(jié):
本章介紹了:為什么要用組件化,需要解決的問題钱慢,組件化工程的配置
項目也才搭建到這里逮京,下一章我們會引入阿里的ARouter組件化框架,完善基礎(chǔ)工程束莫。