產品須要上不一樣的渠道,不一樣的渠道須要定製話,須要依賴不一樣的moduleandroid
剛開始接到這個需求,心裏是高興的這還不簡單。一頓操做猛如虎以下:bash
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 都會依次執行一遍,不知道啥緣由,有知道的大佬指點一下麼,結果以下圖:app
既然上面的方案行不通的話,得另闢蹊徑了,從 gradle bulid 的日誌咱們發現選定了Build Variant,執行的taskName是不同的,以下圖: socket
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
}
}
複製代碼
執行結果以下圖:gradle
xiaomi ui
bingospa