Gradle 通过 projectFalvour 多渠道配置 dependencies
需求
产品需要上不同的渠道,不同的渠道需要定制话,需要依赖不同的module
踩坑
刚开始接到这个需求,内心是高兴的这还不简单。一顿操作猛如虎如下:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
def channel = ""
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.testsocket"
minSdkVersion 17
targetSdkVersion 29
versionCode 1
versionName "1.0"
flavorDimensions "versionCode"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
productFlavors {
xiaomi {
channel = "xiaomi"
}
qihoo {
channel = "qihoo"
}
}
}
dependencies {
println("**********" + channel)
if (channel == "qihoo") {
//依赖不同的module
} else if (channel == "xiaomi") {
//依赖不同的module
}
}
主要是在 productFlavors 中对 channel 进行赋值,然后再 dependencies 进行判断,理想很丰满,现实很骨感。坑比的是,无论我选的是xiaomi还是qihoo的 Build Variant ,最后channel都是等于productFlavors中的最后一个,也就是qihoo,通过输出日志发现即使选定了Build Variant,productFlavors 中所有的 flavours 都会依次执行一遍,不知道啥原因,有知道的大佬指点一下么,结果如下图:
填坑
既然上面的方案行不通的话,得另辟蹊径了,从 gradle bulid 的日志我们发现选定了Build Variant,执行的taskName是不一样的,如下图:
我们就就可以通过不同的taskName来判断对channel进行赋值了,如下:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
def channel = ""
gradle.startParameter.getTaskNames().each { task ->
if (task.toLowerCase().contains("qihoo")) {
channel = "qihoo"
} else if (task.toLowerCase().contains("xiaomi")) {
channel = "xiaomi"
}
}
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.testsocket"
minSdkVersion 17
targetSdkVersion 29
versionCode 1
versionName "1.0"
flavorDimensions "versionCode"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
productFlavors {
xiaomi {
}
qihoo {
}
}
}
dependencies {
println("**********" + channel)
if (channel == "qihoo") {
//依赖不同的module
} else if (channel == "xiaomi") {
//依赖不同的module
}
}
执行结果如下图:
xiaomi
qihoo
bingo