如何在app / build.gradle文件中获取当前选定的产品口味

时间:2019-01-04 02:53:11

标签: android gradle

例如,我有area1和area2口味,但只有area2具有谷歌gms依赖性,我只想将gms插件应用于area2,所以我需要决定 当前的口味为area == 'area2',显然这不能成功,那么我该怎么办?

flavorDimensions "area"
productFlavors {
    area1 {
        dimension "area"
        applicationId 'com.sample.area1'
    }
    area2 {
        dimension "area"
        applicationId 'com.sample.area2'
    }
}
dependencies {
   area2Implementation 'com.google.android.gms:play-services-auth: 16.0.1'
}
if(area == 'area2') {
  apply plugin: 'com.google.gms.google-services'
}

2 个答案:

答案 0 :(得分:0)

只需在Android块中添加以下android.applicationVariants.all配置:

android {

    // Flavor definitions here
    productFlavors {
        // ...
    }

    android.applicationVariants.all { variant ->

        if (variant.flavorName == "area2") {
            apply plugin: 'com.google.gms.google-services'
        }
    }
}

====更新了7/1/2019 ====

只需意识到上面的android.applicationVariants.all块每次都会针对所有构建变体执行(即,如果您有2种构建类型和3种口味,那么6种变体都会被击中)。实际上,这是为各个变体准备不同的配置以供以后构建。

因此,为了达到目的,我们需要在构建阶段应用插件。不知道是否有更好的方法,但是我设法完成了一些棘手的事情,例如:

if (getGradle().getStartParameter().getTaskRequests().toString().contains("Area2")) {
    apply plugin: 'com.google.gms.google-services'
}

我把它放在Gradle文件的末尾,在Android块之外(最初是“ apply plugin”块)。还要注意,您需要在大写中使用风味关键字的第一个字符,因为如果您在gradle控制台中使用println来将其作为任务名称字符串的一部分,例如[:app:assembleArea2Debug]]

答案 1 :(得分:0)

我找到了解决方法:

gradle.taskGraph.whenReady { taskGraph ->
    def tasks = taskGraph.getAllTasks()
        for(task in tasks) {
        if(task.getName().startsWith('assembleArea2')) {
            apply plugin: 'com.google.gms.google-services'
            break
        }
    }
}