谷歌服务。json用于不同的productFlavors

更新: GCM已弃用,请使用FCM

我正在实现新的谷歌云消息,遵循谷歌开发人员页面在这里的指南

我已经成功地运行并测试了它。但我现在的问题是,我有不同的产品口味,具有不同的applicationId/packageName和不同的谷歌云消息传递项目Id。google-services.json必须放在/app/google-services.json文件夹中,而不是放在flavor文件夹中。

有什么方法可以使google-services.json配置不同于许多口味吗?

171644 次浏览

我目前在同一个应用程序包中使用两个GCM项目Id。我加入了谷歌服务。我的第一个GCM项目的json,但我从第一个切换到第二个只改变SENDER_ID:

    String token = instanceID.getToken(SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

(在这一点上,我认为谷歌的服务。Json不是强制性的)

你有很多口味,所以这意味着你会有很多不同的包装id,对吧?所以,只需转到您设置/生成json文件和配置每个包名的页面。所有这些都将添加到json文件中。

我现在很懒发布照片,但基本上:

当配置文件时,您可以看到谷歌向您显示服务器API密钥+发送方ID。所有包装(口味)都是一样的

最后,您只需要一个json文件来处理所有类型。

这里还有一个问题,当你注册获得注册令牌时,你必须测试,检查每个口味是否有差异。我没有触及它,但它认为应该是不同的。现在太晚了,我很困:)希望它能帮助!

我也遇到了同样的问题,但找不到完美的解决方案。这只是个变通办法。 我在想谷歌怎么就没想过口味呢?我希望他们能尽快提出一个更好的解决方案

我在做什么:

我有两种风格,在每一种风格中我都放入了相应的google服务。json: src/flavor1/google-services.jsonsrc/flavor2/google-services.json

然后在build gradle中,我根据不同的口味将文件复制到app/目录:

android {


// set build flavor here to get the right gcm configuration.
//def myFlavor = "flavor1"
def myFlavor = "flavor2"


if (myFlavor.equals("flavor1")) {
println "--> flavor1 copy!"
copy {
from 'src/flavor1/'
include '*.json'
into '.'
}
} else {
println "--> flavor2 copy!"
copy {
from 'src/flavor2/'
include '*.json'
into '.'
}
}


// other stuff
}

限制:你将不得不改变myFlavor 手动在gradle每次你想运行不同的口味(因为它是硬编码)。

我尝试了许多方法来获得当前的构建风格,如afterEvaluate关闭…直到现在都找不到更好的解决办法了。

更新,另一个解决方案:一个谷歌服务。Json的所有口味:

你也可以,为每个口味有不同的包名,然后在谷歌开发人员控制台中,你不必为每个口味创建两个不同的应用程序,而只需在同一个应用程序中创建两个不同的客户端。 那么您将只有一个包含您的两个客户机的google-services.json。 当然,这取决于你如何实现你的口味的后端。如果它们没有分开,那么这个解决方案将无法帮助您

根据ahmed_khan_89的回答,您可以将“复制代码”放在产品风味中。

productFlavors {
staging {
applicationId = "com.demo.staging"


println "Using Staging google-service.json"
copy {
from 'src/staging/'
include '*.json'
into '.'
}
}
production {
applicationId = "com.demo.production"


println "Using Production google-service.json"
copy {
from 'src/production/'
include '*.json'
into '.'
}
}
}

这样你就不必手动切换设置了。

在这个问题上写了一个中柱

有一个类似的问题(使用BuildTypes而不是flavour),并像这样修复了它。

利用Gradle的依赖管理系统。我创建了两个任务,switchToDebugswitchToRelease。要求assembleRelease运行时,switchToRelease也运行。调试也是一样。

def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'


task switchToDebug(type: Copy) {
def buildType = 'debug'
description = 'Switches to DEBUG google-services.json'
from "${srcDir}/${buildType}"
include "$googleServicesJson"
into "$appModuleRootFolder"
}


task switchToRelease(type: Copy) {
def buildType = 'release'
description = 'Switches to RELEASE google-services.json'
from "${srcDir}/${buildType}/"
include "$googleServicesJson"
into "$appModuleRootFolder"
}


afterEvaluate {
processDebugGoogleServices.dependsOn switchToDebug
processReleaseGoogleServices.dependsOn switchToRelease
}

编辑:使用processDebugFlavorGoogleServices/processReleaseFlavorGoogleServices任务在每个风味级别上修改它。

根据@ZakTaccardi的回答,假设你不希望两个版本都有一个项目,把这个添加到build.gradle文件的末尾:

def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'


task switchToStaging(type: Copy) {
outputs.upToDateWhen { false }
def flavor = 'staging'
description = "Switches to $flavor $googleServicesJson"
delete "$appModuleRootFolder/$googleServicesJson"
from "${srcDir}/$flavor/"
include "$googleServicesJson"
into "$appModuleRootFolder"
}


task switchToProduction(type: Copy) {
outputs.upToDateWhen { false }
def flavor = 'production'
description = "Switches to $flavor $googleServicesJson"
from "${srcDir}/$flavor/"
include "$googleServicesJson"
into "$appModuleRootFolder"
}


afterEvaluate {
processStagingDebugGoogleServices.dependsOn switchToStaging
processStagingReleaseGoogleServices.dependsOn switchToStaging
processProductionDebugGoogleServices.dependsOn switchToProduction
processProductionReleaseGoogleServices.dependsOn switchToProduction
}

您需要有文件src/staging/google-services.jsonsrc/production/google-services.json。替换您所使用的风味名称。

我发现谷歌服务插件对于想要添加GCM的项目来说是非常无用的。它只生成以下文件,简单地将您的项目ID添加为字符串资源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Your API key would be on the following line -->
<string name="gcm_defaultSenderId">111111111111</string>
</resources>

似乎只有在直接从Android云消息指南中逐字复制示例代码时才需要它。下面是示例行:

String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),              GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

解决方案

如果你想为不同的构建类型或产品风格切换API项目,你可以定义自己的常量,并在调用getToken() API时选择适当的常量。

private static final String SENDER_ID = "111111111111";
private static final String SANDBOX_SENDER_ID = "222222222222";


String token = instanceID.getToken(
BuildConfig.DEBUG ? SENDER_ID : SANDBOX_SENDER_ID,
GoogleCloudMessaging.INSTANCE_ID_SCOPE,
null);

产品口味

上面的代码用于在调试和发布版本之间切换。对于产品类型,您可以在java源文件中定义不同的API键,并将这些文件放在相应的产品类型目录中。参考:Gradle构建变量

Google -services插件的目的是简化谷歌特性的集成。

因为它只从google服务中生成android资源。json文件,过于复杂的gradle逻辑否定了这一点,我认为。

因此,如果google文档没有说明特定的google特性需要哪些资源,我建议为每个相关的buildtype/flavor生成json文件,看看插件生成了哪些资源,然后手动将这些资源放入各自的src/buildtypeORflavor/res目录中。

删除对google-services插件和json文件的引用,就完成了。

有关google-services gradle-plugin内部工作原理的详细信息,请参阅我的另一个答案:

https://stackoverflow.com/a/33083898/433421 < a href = " https://stackoverflow.com/a/33083898/433421 " > < / >

受到上面@ahmed_khan_89答案的启发。我们可以直接这样保存在gradle文件中。

android{


// set build flavor here to get the right Google-services configuration(Google Analytics).
def currentFlavor = "free" //This should match with Build Variant selection. free/paidFull/paidBasic


println "--> $currentFlavor copy!"
copy {
from "src/$currentFlavor/"
include 'google-services.json'
into '.'
}
//other stuff
}

不需要任何额外的gradle脚本。

谷歌开始在'android_client_info'的名称中添加不同的包名。它在google-services.json中如下所示

"android_client_info": {
"package_name": "com.android.app.companion.dev"
}

因此,以下步骤足以拥有不同的谷歌服务。json的选择。

  1. 有两种口味
  2. 在谷歌分析配置页面添加一个新的开发风格的包,并下载google-services.json。
  3. 注意在新的配置文件中,两个flavor的包id都在那里
  4. 准备你的调味料。

就是这样!

谷歌服务。Json文件是不必要的接收通知。只要在你的构建中为每种味道添加一个变量。gradle文件:

buildConfigField "String", "GCM_SENDER_ID", "\"111111111111\""

使用这个变量BuildConfig。GCM_SENDER_ID代替getString(R.string.gcm_defaultSenderId)注册时:

instanceID.getToken(BuildConfig.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

谷歌在play服务插件的2.0版本中包含了对不同口味的支持。自从这个版本的gradle plugin com.google.gms:google-services:2.0.0-alpha3

你可以这样做

第一步:添加到gradle

// To auto-generate google map api key of google-services.json
implementation 'com.google.android.gms:play-services-maps:17.0.0'

第二步:在应用程序标签中添加到AndroidManifest.xml

<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_api_key" />

第三步:从firebase下载每个flavor JSON文件并添加

app/src/
flavor1/google-services.json
flavor2/google-services.json

插件3.0.0版本在这些位置搜索JSON文件(考虑到您有flavor风味1和构建类型debug):

/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json

即使使用flavorDimensions,我也能做到。我有免费的&一维支付和Mock &另一个维度的刺激。我还有3个构建类型:调试、发布和登台。这是它在我的FreeProd项目中的外观:

enter image description here

有多少谷歌服务?json文件将取决于你的项目的特点,但你将需要至少一个json文件为每个谷歌项目。

如果你想了解这个插件对这些JSON文件做了什么,这里是: # EYZ0 < / p >

官方文档链接: # EYZ0 < / p >

博客文章更新信息:https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

点击这里查看这个插件的最新版本:https://mvnrepository.com/artifact/com.google.gms/google-services?repo=google

我正在使用谷歌服务。json文件,从这里创建:https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging%2Fandroid%2Fclient&cntlbl=Continue%20Adding%20GCM%20Support&%3Fconfigured%3Dtrue

在json结构中,有一个称为客户机的json数组。如果你有多种口味,只需在这里添加不同的属性。

{
"project_info": {
"project_id": "PRODJECT-ID",
"project_number": "PROJECT-NUMBER",
"name": "APPLICATION-NAME"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR1",
"client_id": "android:PACKAGE-NAME-1",
"client_type": 1,
"android_client_info": {
"package_name": "PACKAGE-NAME-1"
}
},
"oauth_client": [],
"api_key": [],
"services": {
"analytics_service": {
"status": 1
},
"cloud_messaging_service": {
"status": 2,
"apns_config": []
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"google_signin_service": {
"status": 1
},
"ads_service": {
"status": 1
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR2",
"client_id": "android:PACKAGE-NAME-2",
"client_type": 1,
"android_client_info": {
"package_name": "PACKAGE-NAME-2"
}
},
"oauth_client": [],
"api_key": [],
"services": {
"analytics_service": {
"status": 1
},
"cloud_messaging_service": {
"status": 2,
"apns_config": []
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"google_signin_service": {
"status": 1
},
"ads_service": {
"status": 1
}
}
}
],
"client_info": [],
"ARTIFACT_VERSION": "1"
}

在我的项目中,我使用相同的项目id,当我在上面的url中添加第二个package-name时,谷歌为我提供了一个包含json-data中的多个客户端的文件。

我们对调试构建有不同的包名(*.debug),所以我想要一些基于flavor和buildType的东西,而不必在processDebugFlavorGoogleServices模式中编写任何与flavor相关的内容。

我在每个版本中创建了一个名为“google-services”的文件夹,包含了json文件的调试版本和发布版本:

enter image description here

在gradle文件的buildTypes部分,添加以下内容:

    applicationVariants.all { variant ->
def buildTypeName = variant.buildType.name
def flavorName = variant.productFlavors[0].name;


def googleServicesJson = 'google-services.json'
def originalPath = "src/$flavorName/google-services/$buildTypeName/$googleServicesJson"
def destPath = "."


copy {
if (flavorName.equals(getCurrentFlavor()) && buildTypeName.equals(getCurrentBuildType())) {
println originalPath
from originalPath
println destPath
into destPath
}
}
}

当你切换构建变量时,它会自动在你的应用模块的根处复制正确的json文件。

在build.gradle的根中添加这两个被调用的方法,以获取当前风格和当前构建类型

def getCurrentFlavor() {
Gradle gradle = getGradle()
String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()


Pattern pattern;


if( tskReqStr.contains( "assemble" ) )
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")


Matcher matcher = pattern.matcher( tskReqStr )


if( matcher.find() ) {
println matcher.group(1).toLowerCase()
return matcher.group(1).toLowerCase()
}
else
{
println "NO MATCH FOUND"
return "";
}
}


def getCurrentBuildType() {
Gradle gradle = getGradle()
String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()


if (tskReqStr.contains("Release")) {
println "getCurrentBuildType release"
return "release"
}
else if (tskReqStr.contains("Debug")) {
println "getCurrentBuildType debug"
return "debug"
}


println "NO MATCH FOUND"
return "";
}

就是这样,你不必担心从你的gradle文件中删除/添加/修改口味,它得到调试或发布谷歌服务。自动json。

下面的解释是一个Android Studio项目,该项目中有一个Firebase项目和不同的Firebase应用程序。 如果目标是在同一个Android Studio项目中的不同Firebase项目中为不同的Firebase应用程序提供不同的JSON文件,(或者如果你不知道有什么区别)看这里。.

每个Android应用程序ID(通常是包名)需要一个Firebase应用程序。通常每个Gradle构建变体都有一个Application ID(如果你使用Gradle构建类型和Gradle构建风格,这可能会发生)


对于谷歌服务3.0和使用重火力点,不需要为不同的风格创建不同的文件。为不同的口味创建不同的文件可能不清楚或直接,如果你有productflavors和Build类型相互组合。

在同一个文件中,您将拥有所有构建类型和风格所需的所有配置。

在Firebase控制台中,您需要为每个包名称添加一个应用程序。假设您有两种风格(开发和实时)和两种构建类型(调试和发布)。这取决于你的配置,但很可能你有4个不同的包名,比如:

  • Com.stackoverflow.example(实时发布)
  • dev (live - dev)
  • debug (debug - release)
  • debug (debug - dev)

在Firebase控制台中需要4个不同的Android应用程序。(在每一台计算机上,您需要添加SHA-1用于调试和运行您正在使用的每台计算机)

当你下载谷歌服务时。Json文件,实际上从哪个应用下载并不重要,它们都包含与所有应用相关的相同信息。

现在你需要在应用程序级别(app/)中定位这个文件。

enter image description here

如果您打开该文件,您将看到If包含所有包名称的所有信息。

一个痛点曾经是插件。为了让它工作,你需要在你的文件底部找到插件。这条线。

apply plugin: 'com.google.gms.google-services'

...需要在你的应用构建的底部。gradle文件。

对于这里所说的大多数,它也适用于以前的版本。我从来没有为不同的配置准备过不同的文件,但现在使用Firebase控制台更容易了,因为它们提供了一个文件,其中包含所有配置所需的所有内容。

简化@Scotti说的话。您需要为特定项目创建多个具有不同包名的应用程序,具体取决于产品风格。

假设您的项目是ABC,具有不同的产品风味X,Y,其中X有一个包名com。x和Y有一个包名为com。然后在firebase控制台中,你需要创建一个项目ABC,其中你需要创建2个包名为com的应用程序。X和com.y。然后你需要下载谷歌服务。Json文件中有2个client-info对象,其中包含这些包,你就可以开始了。

json的代码片段如下所示

{
"client": [
{
"client_info": {
"android_client_info": {
"package_name": "com.x"
}


{
"client_info": {
"android_client_info": {
"package_name": "com.y"
}
]


}

嘿,朋友也寻找名称只使用小写,那么你不会得到这个错误

1) # EYZ0

遵循这个:https://stackoverflow.com/a/31598587/2382964

2) # EYZ0

遵循这个:https://stackoverflow.com/a/33083898/2382964

简单来说就是第二个url,如果你添加google-services。在你的项目中,必须有一个自动生成的google-services文件夹,用于debug变量

app/build/generated/res/google-services/debug/values/values.xml

3) # EYZ0

project_level构建中添加google服务依赖。gradle,你也可以使用version 3.0.0如果你使用app_compact库。

// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'

现在在app_level构建。gradle你必须添加在

// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'

在gradle文件底部添加这一行非常重要。否则Gradle构建不会给你任何错误,但它不能正常工作。

4) # EYZ0

如果你没有build_flavor,就把它放在/app/google-service.json文件夹里。

情况2.)如果你有多个build_flavor并且你有不同的google_services。json文件放在app/src/build_flavor/google-service.json

情况3.)如果你有多个build_flavor和单个google_services。json文件放在app/google-service.json

Firebase现在支持多个应用程序id和一个google-services。json文件。

这篇博文详细描述了它。

您将在Firebase中创建一个父项目,用于您的所有变体。然后在Firebase项目下为每个应用程序id创建单独的Android应用程序。

当你创建了所有的变体,你可以下载一个google-services。支持所有应用程序id的Json。当需要单独查看数据时(例如崩溃报告),你可以用下拉菜单进行切换。

放置你的“谷歌服务”。Json”文件分别在app/src/flavors下 然后是构建。Gradle的应用程序,在android下添加以下代码

gradle.taskGraph.beforeTask { Task task ->
if (task.name ==~ /process.*GoogleServices/) {
android.applicationVariants.all { variant ->
if (task.name ==~ /(?i)process${variant.name}GoogleServices/) {
copy {
from "/src/${variant.flavorName}"
into '.'
include 'google-services.json'
}
}
}
}
}

事实上,只有一个谷歌——服务。MyApp/app/目录下的json是很好的,不需要使用com.google.gms:google-services:3.0.0附加脚本。但是要注意从应用目录MyApp/app/src/flavor1/res/中删除文件google-services.json,以避免错误类型Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package

因此,如果您想通过编程方式将google-services.json文件从所有变体复制到根文件夹。当你切换到特定的变体时,这里有一个解决方案

android {
applicationVariants.all { variant ->
copy {
println "Switches to $variant google-services.json"
from "src/$variant"
include "google-services.json"
into "."
}
}
}

这种方法需要注意的是,您需要在每个变体文件夹中都有google-service.json文件,这里有一个例子。# EYZ1

根据重火力点文档,你也可以使用字符串资源代替google-services.json

因为这个提供者只是读取已知名称的资源,另一种选择是直接将字符串资源添加到应用程序中,而不是使用谷歌Services gradle插件。你可以这样做:

  • 从根build.gradle中移除google-services插件
  • 从项目中删除google-services.json
  • 直接添加字符串资源
  • 在build.gradle中删除应用插件'com.google.gms.google-services'

例# EYZ0:

<string name="google_client_id">XXXXXXXXX.apps.googleusercontent.com</string>
<string name="default_web_client_id">XXXX-XXXXXX.apps.googleusercontent.com</string>
<string name="gcm_defaultSenderId">XXXXXX</string>
<string name="google_api_key">AIzaXXXXXX</string>
<string name="google_app_id">1:XXXXXX:android:XXXXX</string>
<string name="google_crash_reporting_api_key">AIzaXXXXXXX</string>
<string name="project_id">XXXXXXX</string>

简短的回答:

  • < >强实现: 默认情况下,您应该将google-services.json复制到< >强应用< / >强 dir.

对于其他类型,复制google-services.json< >强app / src / {flavor-name} < / >强目录

  • < >强测试: 尝试构建,打开构建选项卡,然后用解析json文件:.....
  • 检查输出消息
    ...
gradle.taskGraph.beforeTask { Task task ->
if (task.name ==~ /process.*GoogleServices/) {
android.applicationVariants.all { variant ->
if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
copy {
from "src/tenants/${variant.flavorName}"
include 'google-services.json'
into '.'
}
}
}
}
}


gradle.taskGraph.afterTask { Task task ->
if (task.name ==~ /process.*GoogleServices/) {
android.applicationVariants.all { variant ->
if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
delete fileTree(".").matching {
include 'google-services.json'
}
}
}
}
}
  1. 从项目中删除现有的google-services.json
  2. 建立在清洁项目
  3. 编译并运行你的应用程序
  4. 查看出现的错误消息,找出您可以将google-services.json..我的是这样的
    File google-services.json is missing. The Google Services Plugin cannot function without it.
    Searched Location:
    C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_Debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\devDebug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\debug\devSuffixYes_EnvQaApistaging_\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffixDebug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_Debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\envDebug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qaDebug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_Debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_\debug\google-services.json
    C:\Users\username\Desktop\HelloWorld\app\google-services.json
    

注意:它还关心flavorDimensions中声明的顺序。我的是flavorDimensions "dev_suffix", "environment"

我知道,你怀疑google-services.json文件should be put in the root app文件夹,是吗?我将打破这个神话——不一定。你可以写谷歌服务。json文件到flavor folder。是这样的:

enter image description here

只需要在同一个项目中添加调味app id和口味的名称作为app,最后下载google-service.json文件,它将在客户端数组[]中包含所有口味,这对所有口味都是好的。

谷歌service json screen shot of client array