将多种产品风味与风味维度组合时,文件 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/developmentFree
和 app/src/developmentPaid
中有相同的 google-services.json
,在 app/src/productionFree
和 app/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}"
}
}
这样,对于每个 typeFlavorName
、vendorFlavorName
和 buildType
变体,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}"
}
}
这样,对于每个 typeFlavorName
、vendorFlavorName
和 buildType
变体,google-services.json
文件在 process{typeFlavorName}{vendorFlavorName}{buildType}GoogleServices
之前复制到 app/
然后删除了。
我正在尝试配置一个 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/developmentFree
和 app/src/developmentPaid
中有相同的 google-services.json
,在 app/src/productionFree
和 app/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}"
}
}
这样,对于每个 typeFlavorName
、vendorFlavorName
和 buildType
变体,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}"
}
}
这样,对于每个 typeFlavorName
、vendorFlavorName
和 buildType
变体,google-services.json
文件在 process{typeFlavorName}{vendorFlavorName}{buildType}GoogleServices
之前复制到 app/
然后删除了。