将多种产品口味与风味维度相结合时,文件google-services.json缺失

Rui*_*ues 6 android google-play-services build.gradle android-gradle-plugin

我正在尝试配置一个Android项目,将多个产品风格与风味维度相结合.

这是build.gradle的片段

android {
    ...
    flavorDimensions "vendor", "type"
    productFlavors {

        development {
            dimension "vendor"
        }

        production {
            dimension "vendor"
        }

        free {
            dimension "type"
        }

        paid {
            dimension "type"
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用谷歌服务,我需要有google-services.json文件,我想为每个供应商提供一个不同的文件,一个用于开发,另一个用于生产.

所以,我有一个google-services.jsonapp/src/development,另一个在app/src/production.

在构建时,我收到此错误:

File google-services.json is missing. The Google Services Plugin cannot function without it. 
  Searched Location: 
  <path>/app/src/developmentPaid/debug/google-services.json
  <path>/app/src/debug/developmentPaid/google-services.json
  <path>/app/src/developmentPaid/google-services.json
  <path>/app/src/debug/google-services.json
  <path>/app/google-services.json
Run Code Online (Sandbox Code Playgroud)

从错误中我需要google-services.jsonapp/src/developmentFree和中使用相同app/src/developmentPaidapp/src/productionFreeapp/src/productionPaid.

使用风味尺寸时,是否需要在两个地方都使用相同的文件?

编辑:

我最终解决了这个问题,为每个合并的productFlavor添加了几个额外的任务.之后我添加了这段代码android:

afterEvaluate {

android.productFlavors.all { flavor ->
    if (flavor.dimension == "vendor") {
        task("copy${flavor.name.capitalize()}GoogleServicesFile", type: Copy) {
            description = 'Switches to google-services.json depending on flavor'
            from "src/${flavor.name}"
            include "google-services.json"
            into "."
        }
        task("delete${flavor.name.capitalize()}GoogleServicesFile", type: Delete) {
            description = 'Delete google-services.json from base folder'
            delete "./google-services.json"
        }
    }
}

android.applicationVariants.all { variant ->
    def buildType = variant.buildType.name.capitalize()
    def typeFlavorName = variant.productFlavors.get(0).name.capitalize()
    def vendorFlavorName = variant.productFlavors.get(1).name.capitalize()
    def copyFileTaskName = "copy${vendorFlavorName}GoogleServicesFile"
    def deleteFileTaskName = "delete${vendorFlavorName}GoogleServicesFile"
    def processGoogleServicesTaskName = "process${typeFlavorName}${vendorFlavorName}${buildType}GoogleServices"
    tasks."${processGoogleServicesTaskName}".dependsOn "${copyFileTaskName}"
    tasks."${processGoogleServicesTaskName}".finalizedBy "${deleteFileTaskName}"
}
Run Code Online (Sandbox Code Playgroud)

}

这样一来,对于每一个typeFlavorName,vendorFlavorName并且buildType变化的google-services.json文件复制到app/之前process{typeFlavorName}{vendorFlavorName}{buildType}GoogleServices和之后被删除.

Rui*_*ues 5

我最终通过为每个合并的 ProductFlavor 执行几个额外的任务来解决这个问题。我在之后添加了这段代码android

afterEvaluate {

    android.productFlavors.all { flavor ->
        if (flavor.dimension == "vendor") {
            task("copy${flavor.name.capitalize()}GoogleServicesFile", type: Copy) {
                description = 'Switches to google-services.json depending on flavor' from "src/${flavor.name}"
                include "google-services.json" into "."
            }
            task("delete${flavor.name.capitalize()}GoogleServicesFile", type: Delete) {
                description = 'Delete google-services.json from base folder'
                delete "./google-services.json"
            }
        }
    }

    android.applicationVariants.all { variant ->
        def buildType = variant.buildType.name.capitalize()
        def typeFlavorName = variant.productFlavors.get(0).name.capitalize()
        def vendorFlavorName = variant.productFlavors.get(1).name.capitalize()
        def copyFileTaskName = "copy${vendorFlavorName}GoogleServicesFile"
        def deleteFileTaskName = "delete${vendorFlavorName}GoogleServicesFile"
        def processGoogleServicesTaskName = "process${typeFlavorName}${vendorFlavorName}${buildType}GoogleServices"
        tasks."${processGoogleServicesTaskName}".dependsOn "${copyFileTaskName}"
        tasks."${processGoogleServicesTaskName}".finalizedBy "${deleteFileTaskName}"
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,对于每个typeFlavorNamevendorFlavorNamebuildType变体,google-services.json文件都会被复制到app/之前process{typeFlavorName}{vendorFlavorName}{buildType}GoogleServices并在之后删除。