将多种产品风味与风味维度组合时,文件 google-services.json 丢失

File google-services.json is missing when combining multiple product flavors with flavor dimensions

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

这是build.gradle

的片段
android {
    ...
    flavorDimensions "vendor", "type"
    productFlavors {

        development {
            dimension "vendor"
        }

        production {
            dimension "vendor"
        }

        free {
            dimension "type"
        }

        paid {
            dimension "type"
        }
    }
    ...
}

我正在使用 google 服务,我需要 google-services.json 文件,我希望每个供应商都有一个不同的文件,一个用于 development 和另一个 production.

所以我在 app/src/development 中有一个 google-services.json,在 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

根据错误,我需要在 app/src/developmentFreeapp/src/developmentPaid 中有相同的 google-services.json,在 app/src/productionFreeapp/src/productionPaid 中有另一个。

使用风味维度时,我需要在两个地方使用相同的文件吗?

编辑:

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

评估后{

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}"
}

}

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

我最终通过为每个合并的 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}"
    }
}

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