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

相关文章
相关标签/搜索