google-services.json 用于不同的产品口味
google-services.json for different productFlavors
我正在按照 Google 开发者页面 here
中的指南实施新的 Google 云消息传递
我已经成功 运行 并进行了测试。但我现在的问题是我有不同的产品风格,具有不同的 applicationId/packageName 和不同的 Google 云消息传递项目 ID。 google-services.json
必须放在 /app/google-services.json
而不是 flavors 文件夹。
有什么方法可以使 google-services.json
配置因多种口味而不同吗?
我目前在同一个应用程序包中使用两个 GCM 项目 ID。我放了第一个 GCM 项目的 google-service.json 但我从第一个切换到第二个只改变了 SENDER_ID:
String token = instanceID.getToken(SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
(此时我认为 google-services.json 不是强制性的)
你有很多口味,所以这意味着你会有很多不同的包ID,对吧?因此,只需转到 setup/generate 您的 json 文件所在的页面并为每个包名称进行配置。所有这些都将添加到 json 文件。
我现在很懒得post图片,但基本上:
- 转到https://developers.google.com/mobile/add
- select 平台
- select 你的应用程序
- 重要提示:在字段 "android package name"
中输入您的调味包名称
- ...继续获取你的配置文件。下载吧!
配置文件时,您可以看到google 向您显示服务器API 密钥+发件人ID。所有包装(口味)都一样
最后,您只需要一个 json 文件即可满足所有口味。
这里还有一个问题,您必须在注册以获得注册令牌时进行测试,检查每种口味是否存在差异。我没有触及它,但它认为它应该有所不同。现在太晚了,我很困:)希望对你有帮助!
嗯,我运行遇到了同样的问题,但找不到任何完美的解决方案。这只是一种解决方法。
我想知道 Google 怎么没有考虑口味...?我希望他们能尽快提出更好的解决方案。
我在做什么:
我有两种口味,每一种我都放了相应的 google-services.json : src/flavor1/google-services.json
和 src/flavor2/google-services.json
.
然后在构建 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
close...直到现在才找到更好的解决方案。
更新,另一种解决方案:一个google-services.json适用于所有口味:
您还可以为每种风格使用不同的包名称,然后在 google developer console 中您不必为每种风格创建两个不同的应用程序,而只需在同一个应用程序中创建两个不同的客户端。
那么您将只有一个 google-services.json
包含您的两个客户。
当然,这取决于您如何实现风味的后端。如果它们没有分开,那么此解决方案将无济于事。
根据ahmed_khan_89的回答,可以把你"copy code"放在product flavors里面。
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 '.'
}
}
}
这样就不用手动切换设置了。
就此问题写了 Medium post。
遇到了类似的问题(使用 BuildTypes 而不是 Flavors),并像这样修复了它。
利用 Gradle 的依赖管理系统。我创建了两个任务,switchToDebug
和 switchToRelease
。要求任何时候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.json
和 src/production/google-services.json
。替换您使用的风味名称。
我发现 google-services 插件对于想要添加 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>
看来只有直接从 Cloud Messaging for 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 Build Variants
google-services 插件的重点是简化 Google 功能的集成。
因为它只从 google-services.json 文件生成 android-资源,我认为过于复杂的 gradle-逻辑否定了这一点。
因此,如果 Google-文档没有说明特定 Google-功能需要哪些资源,我建议为每个相关 JSON-文件生成=23=],查看插件生成了哪些资源,然后将这些资源手动放入各自的 src/buildtypeORflavor/res 目录中。
删除对 google-services 插件和 JSON-文件的引用,然后就完成了。
有关 google-services gradle-plugin 内部工作的详细信息,请参阅我的其他答案:
受上述@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 脚本。
Google 开始在 'android_client_info' 的名称中添加不同的包名称。它看起来像下面 google-services.json
"android_client_info": {
"package_name": "com.android.app.companion.dev"
}
因此,以下步骤足以进行不同的 google-services.json 选择。
- 有2种口味
- 在 google 分析配置页面添加新的开发风格包并下载 google-services.json.
- 注意在新的配置文件中,你的两个 flavor 的包 id 都在那里
- 准备好你的任何口味构建。
就是这样!..
google-services.json 文件不需要接收通知。只需在 build.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);
Google 在播放服务插件 2.0 版中包含了对风格的支持。由于此版本 gradle plugin com.google.gms:google-services:2.0.0-alpha3
你可以做到这一点
第 1 步:添加到 gradle
// To auto-generate google map api key of google-services.json
implementation 'com.google.android.gms:play-services-maps:17.0.0'
第 2 步:在应用程序标签中添加 AndroidManifest.xml
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_api_key" />
第 3 步:从 firebase 下载每个 flavor JSON 文件并添加它
app/src/
flavor1/google-services.json
flavor2/google-services.json
3.0.0 版插件在这些位置搜索 JSON 文件(考虑到您有 flavor
flavor1 和构建类型 debug
):
/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json
即使使用 flavorDimensions,这对我也很有效。我在一个维度上有免费和付费,在另一个维度上有模拟和生产。我还有 3 种构建类型:调试、发布和暂存。这就是我的 FreeProd 风格项目中的样子:
有多少 google-services.json 文件将取决于您项目的特点,但每个 Google 项目至少需要一个 JSON 文件。
如果您想了解有关此插件如何处理这些 JSON 文件的更多详细信息,请访问此处:
https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720
Link 到官方文档:
https://developers.google.com/android/guides/google-services-plugin
博客 post 更新信息: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
我正在使用从此处创建的 google-services.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-structure 中有一个 JSON-array 叫做 clients。如果您有多种口味,只需在此处添加不同的属性即可。
{
"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"
}
在我的项目中,我使用相同的 project-id,当我在上面的 url 中添加第二个 package-name 时,google 为我提供了一个json-data.
中包含多个客户端的文件
我们为调试构建 (*.debug) 使用了不同的包名,所以我想要一些基于 flavor 和 buildType 的东西,而不必在 processDebugFlavorGoogleServices
的模式中编写任何与 flavor 相关的东西。
我在每种风格中创建了一个名为 "google-services" 的文件夹,其中包含 json 文件的调试版本和发布版本:
在 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 文件中的 removing/adding/modifying 风格,它会获得调试或发布 google-services.json自动。
更新: 以下说明针对一个 Android Studio 项目,其中有一个 Firebase 项目和该项目中的不同 Firebase 应用程序。
如果目标是在同一 Android Studio 项目中的不同 Firebase 项目中为不同的 Firebase 应用程序提供不同的 JSON 文件,(或者如果您不知道有什么区别)look here.。
每个 Android 应用程序 ID(通常是程序包名称)需要一个 Firebase 应用程序。每个 Gradle 构建变体有一个应用程序 ID 是很常见的(如果您使用 Gradle 构建类型和 Gradle 构建风格,这很可能)
从 Google Services 3.0 和使用 Firebase 开始,没有必要为不同的风格创建不同的文件。如果您有相互组合的 productFlavours 和 Build 类型,则为不同的口味创建不同的文件可能并不清晰或直接。
在同一个文件中,您将拥有所有构建类型和风格所需的所有配置。
在 Firebase 控制台中,您需要为每个包名称添加一个应用程序。假设您有 2 种风格(开发和实时)和 2 种构建类型(调试和发布)。取决于您的配置,但您可能有 4 个不同的包名称,例如:
- com.Whosebug.example(直播 - 发布)
- com.Whosebug.example.dev(实时 - 开发)
- com.Whosebug.example.debug(调试-发布)
- com.Whosebug.example.dev.debug(调试 - 开发)
您需要在 Firebase 控制台中使用 4 个不同的 Android 应用程序。 (在每一个上你都需要为你使用的每台计算机添加 SHA-1 用于调试和实时)
当您下载 google-services.json 文件时,实际上您从哪个应用程序下载它并不重要,它们都包含与您的所有应用程序相关的相同信息。
现在您需要在应用级别 (app/) 中找到此文件。
如果您打开该文件,您会看到它包含所有包名称的所有信息。
插件的痛点。为了让它工作,您需要在文件底部找到该插件。所以这一行..
apply plugin: 'com.google.gms.google-services'
...需要位于应用 build.gradle 文件的底部。
对于这里所说的大部分内容,它也适用于以前的版本。我从来没有为不同的配置使用不同的文件,但现在使用 Firebase 控制台更容易,因为它们提供一个文件,其中包含您所有配置所需的一切。
简化@Scotti 所说的内容。您需要根据产品风格为特定项目创建具有不同包名称的多个应用程序。
假设您的项目是 ABC,具有不同的产品风格 X、Y,其中 X 的包名称为 com.x,Y 的包名称为 com.y,那么您需要在 firebase 控制台中创建一个项目ABC,您需要在其中创建 2 个包名称为 com.x 和 com.y 的应用程序。然后您需要下载 google-services.json 文件,其中将包含 2 个包含这些包的客户端信息对象,您就可以开始了。
json 的片段将是这样的
{
"client": [
{
"client_info": {
"android_client_info": {
"package_name": "com.x"
}
{
"client_info": {
"android_client_info": {
"package_name": "com.y"
}
]
}
嘿,朋友们也查找仅使用小写的名称,那么您不会收到此错误
1.) google-services.json到底是做什么的?
关注这个:
2.) google-services.json 文件如何影响您的 android 工作室项目?
关注这个:
只是第二个 url 的简称,如果您在项目中添加 google-services.json,则必须为 [=14] 自动生成 google-services
文件夹=] 此路径中的变体
app/build/generated/res/google-services/debug/values/values.xml
3.) 要做什么,才能完成?
在project_level
build.gradle中添加google-services依赖,如果你使用app_compact库也可以使用version 3.0.0
// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'
现在 app_level
build.gradle 您必须在 底部添加 。
// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'
注意: 在 gradle 文件的底部添加这一行非常重要。否则 Gradle 构建不会给你任何错误,但它不会正常工作。
4.) 在结构中放置 google-service.json 文件的位置。
案例 1.) 如果你没有 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 现在支持一个 google-services.json 文件的多个应用程序 ID。
This blog post描述的很详细
您将在 Firebase 中创建一个用于所有变体的父项目。然后,您在 Firebase 中为您拥有的每个应用程序 ID 在该项目下创建单独的 Android 应用程序。
创建所有变体后,您可以下载支持所有应用程序 ID 的 google-services.json。当需要单独查看数据(即崩溃报告)时,您可以使用下拉菜单进行切换。
将您的 "google-services.json" 文件分别放在 app/src/flavors 下
然后在应用程序的 build.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/
目录下的google-services.json就可以了,不需要额外的脚本com.google.gms:google-services:3.0.0
。但是要注意删除app目录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
文件,这是一个示例。
根据 Firebase docs,您还可以使用 字符串资源 而不是 google-services.json.
Because this provider is just reading resources with known names, another option is to add the string resources directly to your app instead of using the Google Services gradle plugin. You can do this by:
- Removing the
google-services
plugin from your root build.gradle
- Deleting the
google-services.json
from your project
- Adding the string resources directly
- Deleting apply plugin:
'com.google.gms.google-services'
from your app build.gradle
示例strings.xml
:
<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
复制到 app dir.
对于其他风格,将 google-services.json
复制到 app/src/{flavor-name} 目录
- 测试:
尝试构建,打开构建选项卡,然后使用 Parsing 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'
}
}
}
}
}
- 从您的项目中删除现有的
google-services.json
。
- 构建 > 清理项目
- 编译并运行您的应用程序
- 查看出现的错误消息,找出可以将
google-services.json
..mine 放在哪里
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
文件夹有疑问,是吗?我会打破这个神话——不一定。您也可以将 google-services.json 文件放入 flavor folder
。像这样:
在同一个项目中添加flavor的app id和flavor的名称,最后下载google-service.json文件它将包含客户端数组[]中的所有口味,这对所有口味都很好。
我正在按照 Google 开发者页面 here
中的指南实施新的 Google 云消息传递我已经成功 运行 并进行了测试。但我现在的问题是我有不同的产品风格,具有不同的 applicationId/packageName 和不同的 Google 云消息传递项目 ID。 google-services.json
必须放在 /app/google-services.json
而不是 flavors 文件夹。
有什么方法可以使 google-services.json
配置因多种口味而不同吗?
我目前在同一个应用程序包中使用两个 GCM 项目 ID。我放了第一个 GCM 项目的 google-service.json 但我从第一个切换到第二个只改变了 SENDER_ID:
String token = instanceID.getToken(SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
(此时我认为 google-services.json 不是强制性的)
你有很多口味,所以这意味着你会有很多不同的包ID,对吧?因此,只需转到 setup/generate 您的 json 文件所在的页面并为每个包名称进行配置。所有这些都将添加到 json 文件。
我现在很懒得post图片,但基本上:
- 转到https://developers.google.com/mobile/add
- select 平台
- select 你的应用程序
- 重要提示:在字段 "android package name" 中输入您的调味包名称
- ...继续获取你的配置文件。下载吧!
配置文件时,您可以看到google 向您显示服务器API 密钥+发件人ID。所有包装(口味)都一样
最后,您只需要一个 json 文件即可满足所有口味。
这里还有一个问题,您必须在注册以获得注册令牌时进行测试,检查每种口味是否存在差异。我没有触及它,但它认为它应该有所不同。现在太晚了,我很困:)希望对你有帮助!
嗯,我运行遇到了同样的问题,但找不到任何完美的解决方案。这只是一种解决方法。 我想知道 Google 怎么没有考虑口味...?我希望他们能尽快提出更好的解决方案。
我在做什么:
我有两种口味,每一种我都放了相应的 google-services.json : src/flavor1/google-services.json
和 src/flavor2/google-services.json
.
然后在构建 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
close...直到现在才找到更好的解决方案。
更新,另一种解决方案:一个google-services.json适用于所有口味:
您还可以为每种风格使用不同的包名称,然后在 google developer console 中您不必为每种风格创建两个不同的应用程序,而只需在同一个应用程序中创建两个不同的客户端。
那么您将只有一个 google-services.json
包含您的两个客户。
当然,这取决于您如何实现风味的后端。如果它们没有分开,那么此解决方案将无济于事。
根据ahmed_khan_89的回答,可以把你"copy code"放在product flavors里面。
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 '.'
}
}
}
这样就不用手动切换设置了。
就此问题写了 Medium post。
遇到了类似的问题(使用 BuildTypes 而不是 Flavors),并像这样修复了它。
利用 Gradle 的依赖管理系统。我创建了两个任务,switchToDebug
和 switchToRelease
。要求任何时候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.json
和 src/production/google-services.json
。替换您使用的风味名称。
我发现 google-services 插件对于想要添加 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>
看来只有直接从 Cloud Messaging for 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 Build Variants
google-services 插件的重点是简化 Google 功能的集成。
因为它只从 google-services.json 文件生成 android-资源,我认为过于复杂的 gradle-逻辑否定了这一点。
因此,如果 Google-文档没有说明特定 Google-功能需要哪些资源,我建议为每个相关 JSON-文件生成=23=],查看插件生成了哪些资源,然后将这些资源手动放入各自的 src/buildtypeORflavor/res 目录中。
删除对 google-services 插件和 JSON-文件的引用,然后就完成了。
有关 google-services gradle-plugin 内部工作的详细信息,请参阅我的其他答案:
受上述@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 脚本。
Google 开始在 'android_client_info' 的名称中添加不同的包名称。它看起来像下面 google-services.json
"android_client_info": {
"package_name": "com.android.app.companion.dev"
}
因此,以下步骤足以进行不同的 google-services.json 选择。
- 有2种口味
- 在 google 分析配置页面添加新的开发风格包并下载 google-services.json.
- 注意在新的配置文件中,你的两个 flavor 的包 id 都在那里
- 准备好你的任何口味构建。
就是这样!..
google-services.json 文件不需要接收通知。只需在 build.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);
Google 在播放服务插件 2.0 版中包含了对风格的支持。由于此版本 gradle plugin com.google.gms:google-services:2.0.0-alpha3
你可以做到这一点
第 1 步:添加到 gradle
// To auto-generate google map api key of google-services.json
implementation 'com.google.android.gms:play-services-maps:17.0.0'
第 2 步:在应用程序标签中添加 AndroidManifest.xml
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_api_key" />
第 3 步:从 firebase 下载每个 flavor JSON 文件并添加它
app/src/
flavor1/google-services.json
flavor2/google-services.json
3.0.0 版插件在这些位置搜索 JSON 文件(考虑到您有 flavor
flavor1 和构建类型 debug
):
/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json
即使使用 flavorDimensions,这对我也很有效。我在一个维度上有免费和付费,在另一个维度上有模拟和生产。我还有 3 种构建类型:调试、发布和暂存。这就是我的 FreeProd 风格项目中的样子:
有多少 google-services.json 文件将取决于您项目的特点,但每个 Google 项目至少需要一个 JSON 文件。
如果您想了解有关此插件如何处理这些 JSON 文件的更多详细信息,请访问此处: https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720
Link 到官方文档: https://developers.google.com/android/guides/google-services-plugin
博客 post 更新信息: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
我正在使用从此处创建的 google-services.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-structure 中有一个 JSON-array 叫做 clients。如果您有多种口味,只需在此处添加不同的属性即可。
{
"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"
}
在我的项目中,我使用相同的 project-id,当我在上面的 url 中添加第二个 package-name 时,google 为我提供了一个json-data.
中包含多个客户端的文件我们为调试构建 (*.debug) 使用了不同的包名,所以我想要一些基于 flavor 和 buildType 的东西,而不必在 processDebugFlavorGoogleServices
的模式中编写任何与 flavor 相关的东西。
我在每种风格中创建了一个名为 "google-services" 的文件夹,其中包含 json 文件的调试版本和发布版本:
在 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 文件中的 removing/adding/modifying 风格,它会获得调试或发布 google-services.json自动。
更新: 以下说明针对一个 Android Studio 项目,其中有一个 Firebase 项目和该项目中的不同 Firebase 应用程序。 如果目标是在同一 Android Studio 项目中的不同 Firebase 项目中为不同的 Firebase 应用程序提供不同的 JSON 文件,(或者如果您不知道有什么区别)look here.。
每个 Android 应用程序 ID(通常是程序包名称)需要一个 Firebase 应用程序。每个 Gradle 构建变体有一个应用程序 ID 是很常见的(如果您使用 Gradle 构建类型和 Gradle 构建风格,这很可能)
从 Google Services 3.0 和使用 Firebase 开始,没有必要为不同的风格创建不同的文件。如果您有相互组合的 productFlavours 和 Build 类型,则为不同的口味创建不同的文件可能并不清晰或直接。
在同一个文件中,您将拥有所有构建类型和风格所需的所有配置。
在 Firebase 控制台中,您需要为每个包名称添加一个应用程序。假设您有 2 种风格(开发和实时)和 2 种构建类型(调试和发布)。取决于您的配置,但您可能有 4 个不同的包名称,例如:
- com.Whosebug.example(直播 - 发布)
- com.Whosebug.example.dev(实时 - 开发)
- com.Whosebug.example.debug(调试-发布)
- com.Whosebug.example.dev.debug(调试 - 开发)
您需要在 Firebase 控制台中使用 4 个不同的 Android 应用程序。 (在每一个上你都需要为你使用的每台计算机添加 SHA-1 用于调试和实时)
当您下载 google-services.json 文件时,实际上您从哪个应用程序下载它并不重要,它们都包含与您的所有应用程序相关的相同信息。
现在您需要在应用级别 (app/) 中找到此文件。
如果您打开该文件,您会看到它包含所有包名称的所有信息。
插件的痛点。为了让它工作,您需要在文件底部找到该插件。所以这一行..
apply plugin: 'com.google.gms.google-services'
...需要位于应用 build.gradle 文件的底部。
对于这里所说的大部分内容,它也适用于以前的版本。我从来没有为不同的配置使用不同的文件,但现在使用 Firebase 控制台更容易,因为它们提供一个文件,其中包含您所有配置所需的一切。
简化@Scotti 所说的内容。您需要根据产品风格为特定项目创建具有不同包名称的多个应用程序。
假设您的项目是 ABC,具有不同的产品风格 X、Y,其中 X 的包名称为 com.x,Y 的包名称为 com.y,那么您需要在 firebase 控制台中创建一个项目ABC,您需要在其中创建 2 个包名称为 com.x 和 com.y 的应用程序。然后您需要下载 google-services.json 文件,其中将包含 2 个包含这些包的客户端信息对象,您就可以开始了。
json 的片段将是这样的
{
"client": [
{
"client_info": {
"android_client_info": {
"package_name": "com.x"
}
{
"client_info": {
"android_client_info": {
"package_name": "com.y"
}
]
}
嘿,朋友们也查找仅使用小写的名称,那么您不会收到此错误
1.) google-services.json到底是做什么的?
关注这个:
2.) google-services.json 文件如何影响您的 android 工作室项目?
关注这个:
只是第二个 url 的简称,如果您在项目中添加 google-services.json,则必须为 [=14] 自动生成 google-services
文件夹=] 此路径中的变体
app/build/generated/res/google-services/debug/values/values.xml
3.) 要做什么,才能完成?
在project_level
build.gradle中添加google-services依赖,如果你使用app_compact库也可以使用version 3.0.0
// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'
现在 app_level
build.gradle 您必须在 底部添加 。
// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'
注意: 在 gradle 文件的底部添加这一行非常重要。否则 Gradle 构建不会给你任何错误,但它不会正常工作。
4.) 在结构中放置 google-service.json 文件的位置。
案例 1.) 如果你没有 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 现在支持一个 google-services.json 文件的多个应用程序 ID。
This blog post描述的很详细
您将在 Firebase 中创建一个用于所有变体的父项目。然后,您在 Firebase 中为您拥有的每个应用程序 ID 在该项目下创建单独的 Android 应用程序。
创建所有变体后,您可以下载支持所有应用程序 ID 的 google-services.json。当需要单独查看数据(即崩溃报告)时,您可以使用下拉菜单进行切换。
将您的 "google-services.json" 文件分别放在 app/src/flavors 下 然后在应用程序的 build.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/
目录下的google-services.json就可以了,不需要额外的脚本com.google.gms:google-services:3.0.0
。但是要注意删除app目录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
文件,这是一个示例。
根据 Firebase docs,您还可以使用 字符串资源 而不是 google-services.json.
Because this provider is just reading resources with known names, another option is to add the string resources directly to your app instead of using the Google Services gradle plugin. You can do this by:
- Removing the
google-services
plugin from your root build.gradle- Deleting the
google-services.json
from your project- Adding the string resources directly
- Deleting apply plugin:
'com.google.gms.google-services'
from your app build.gradle
示例strings.xml
:
<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
复制到 app dir.
对于其他风格,将 google-services.json
复制到 app/src/{flavor-name} 目录
- 测试: 尝试构建,打开构建选项卡,然后使用 Parsing 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'
}
}
}
}
}
- 从您的项目中删除现有的
google-services.json
。 - 构建 > 清理项目
- 编译并运行您的应用程序
- 查看出现的错误消息,找出可以将
google-services.json
..mine 放在哪里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
文件夹有疑问,是吗?我会打破这个神话——不一定。您也可以将 google-services.json 文件放入 flavor folder
。像这样:
在同一个项目中添加flavor的app id和flavor的名称,最后下载google-service.json文件它将包含客户端数组[]中的所有口味,这对所有口味都很好。