如何维护两个google-services.json,生产和调试

Posted

技术标签:

【中文标题】如何维护两个google-services.json,生产和调试【英文标题】:How to maintain two google-services.json, production and debug 【发布时间】:2016-08-28 06:28:59 【问题描述】:

我在我的应用程序中包含了 gcm 的功能,为此我需要维护两个 google-services.json,一个用于 debug,一个用于 release 构建。怎么做 ?? 我可以在不使用 google-services.json 的情况下配置 gcm 吗??

【问题讨论】:

No matching client found for package name (Google Analytics) - multiple productFlavors & buildTypes的可能重复 【参考方案1】:

当前插件 (com.google.gms:google-services:2.1.X) 支持 flavors 但不支持 types

所以如果你创建一个productflavor你可以把json文件放在src/$flavorname

例子:

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

目前它不适用于类型(调试、发布...),但您可以使用这样的东西:

app/src/release/google-services.json
app/google-services.json

在这种情况下,插件会查找位置并在找到 google-services.json 文件时停止。

如果你使用一种风味,它会变成:

app/src/foo/release/google-services.json
app/src/foo/google-services.json

您可以找到更新的信息here。

【讨论】:

最新的插件怎么样?是否支持类型?【参考方案2】:

我目前正在使用以下版本:com.google.gms:google-services:4.3.3、com.google.firebase:firebase-messaging:20.2.0

将您的google-services.json 文件放在您的$projectName/app/src/$buildType 目录中。例如,将一个 json 文件放在 src/release 中,将另一个放在 src/debug 中。您可能需要创建发布和调试文件夹。

注意:将这些文件添加到 app 文件夹中是一个常见错误,请务必按照上述说明将其添加到 src 文件夹中。

google-services 插件总是寻找 google-services.json 文件在两个目录中:首先,在 $projectName/app/src/$buildType/google-services.json。如果没有 在这里找到它,它在上一层,到 $projectName/app/google-services.json。因此,当您构建 您的应用程序的调试版本,它将搜索 google-services.json 在 $projectName/app/src/debug/ 目录上。

在下面的链接中,请参阅David Ojeda's response。

【讨论】:

我只有 src/debug 文件夹,用于调试构建。另一个包含在 src/google_services.json 中的生产应用程序。这两个文件都有 com.myapp.debug 和 com.myapp 的“client_info”对象数组。对吗? 这可能有效,也可能无效,但我的回答是把你的生产谷歌服务放在 src/release 文件夹中,而不是 src 文件夹中。我就是这样做的。【参考方案3】:

首先,将每个 buildType 的相应 google_services.json 放置在以下位置:

app/src/debug/google_services.json
app/src/test/google_services.json
app/google_services.json

注意:根app/google_services.json 这个文件应该有根据构建变体复制根json文件中的json代码

现在,让我们在您的应用程序的 build.gradle 中创建一些 gradle 任务,以自动将相应的 google_services.json 移动到 app/google_services.json

将其复制到 app/Gradle 文件中

task switchToDebug(type: Copy) 
description = 'Switches to DEBUG google-services.json'
from "src/debug"
include "google-services.json"
into "."


task switchToRelease(type: Copy) 
description = 'Switches to RELEASE google-services.json'
from "src/release"
include "google-services.json"
into "."

很好——但是在构建应用之前必须手动运行这些任务很麻烦。我们希望在之前的某个时间运行上述适当的复制任务:运行 assembleDebug 或 :assembleRelease。让我们看看运行 :assembleRelease 时会发生什么:将这个复制到 /gradlew 文件中

Zaks-MBP:my_awesome_application zak$ ./gradlew assembleRelease
Parallel execution is an incubating feature.
.... (other tasks)
:app:processReleaseGoogleServices
....
:app:assembleRelease

注意 :app:processReleaseGoogleServices 任务。此任务负责处理根 google_services.json 文件。我们希望处理正确的 google_services.json,因此我们必须事先立即运行我们的复制任务。 将此添加到您的 build.gradle。注意 afterEvaluate 封闭。

将其复制到 app/Gradle 文件中

afterEvaluate 
processDebugGoogleServices.dependsOn switchToDebug
processReleaseGoogleServices.dependsOn switchToRelease
 

现在,任何时候 :app:processReleaseGoogleServices 被调用,我们新定义的 :app:switchToRelease 都会被预先调用。调试 buildType 的逻辑相同。您可以运行 :app:assembleRelease 并且发布版本 google_services.json 将自动复制到您的应用模块的根文件夹。

归功于:Zak Taccardi https://medium.com/google-cloud/automatic-per-variant-google-services-json-configurations-with-gradle-d3d3e40abc0e

【讨论】:

以上是关于如何维护两个google-services.json,生产和调试的主要内容,如果未能解决你的问题,请参考以下文章

调用 window.history.back() 时如何维护用户输入?

如何在同一系统中维护多个具有多个 ssh 密钥的 bitbucket 帐户

无人登录时如何运行维护脚本?

如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID

如何有效地维护传递闭包表?

添加到后台堆栈时如何维护片段状态?