Gradle 經過 projectFalvour 多渠道配置 dependencies

需求

產品須要上不一樣的渠道,不一樣的渠道須要定製話,須要依賴不一樣的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

咱們就就能夠經過不一樣的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
    }
}

複製代碼

執行結果以下圖:gradle

xiaomi ui

qihoo

bingospa

相關文章
相關標籤/搜索