接上文
ext {
// 定義一個項(xiàng)目全局變量isRelease,用于動態(tài)切換:組件化模式 / 集成化模式
// false: 組件化模式(子模塊可以獨(dú)立運(yùn)行),true :集成化模式(打包整個項(xiàng)目apk,子模塊不可獨(dú)立運(yùn)行)
isRelease = false
......
}
主模塊的build.gradle
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 循環(huán)引入第三方庫
support.each { k, v -> implementation v }
implementation project(':common') // 公共基礎(chǔ)庫
// 如果是集成化模式,做發(fā)布版本時。各個模塊都不能獨(dú)立運(yùn)行了
if (isRelease) {
implementation project(':order')
implementation project(':personal')
}
}
組件的build.gradle
if (isRelease) { // 如果是發(fā)布版本時,各個模塊都不能獨(dú)立運(yùn)行
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
def rootAndroidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.dependencies
android {
compileSdkVersion rootAndroidId.compileSdkVersion
buildToolsVersion rootAndroidId.buildToolsVersion
defaultConfig {
if (!isRelease) { // 如果是集成化模式,不能有applicationId
applicationId appId.order // 組件化模式能獨(dú)立運(yùn)行才能有applicationId
}
minSdkVersion rootAndroidId.minSdkVersion
targetSdkVersion rootAndroidId.targetSdkVersion
versionCode rootAndroidId.versionCode
versionName rootAndroidId.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// 這個方法接收三個非空的參數(shù),第一個:確定值的類型,第二個:指定key的名字,第三個:傳值(必須是String)
// 為什么需要定義這個?因?yàn)閟rc代碼中有可能需要用到跨模塊交互,如果是組件化模塊顯然不行
// 切記:不能在android根節(jié)點(diǎn),只能在defaultConfig或buildTypes節(jié)點(diǎn)下
buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
}
......
}
組件化和集成化的區(qū)別在于 apply plugin和applicationId
組件創(chuàng)建的時候,最好創(chuàng)建為module,如果創(chuàng)建成 library,會缺少manifest配置和activity,組件化的時候還要拷貝過去,比較麻煩
測試環(huán)境隔離
// 配置資源路徑,方便測試環(huán)境,打包不集成到正式環(huán)境
sourceSets {
main {
if (!isRelease) {
// 如果是組件化模式,需要單獨(dú)運(yùn)行時
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
// 集成化模式,整個項(xiàng)目打包apk
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
// release 時 debug 目錄下文件不需要合并到主工程
exclude '**/debug/**'
}
}
}
}