google-services.json用于不同的productFlavors

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了google-services.json用于不同的productFlavors相关的知识,希望对你有一定的参考价值。

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

我正在按照Google Developers页面here的指南实施新的Google Cloud Messaging

我已成功运行并测试它。但我现在的问题是我有不同的产品风格,不同的applicationId / packageName和不同的Google Cloud Messaging Project Id。 google-services.json必须放在/app/google-services.json而不是flavors文件夹。

有没有办法让google-services.json配置不同的许多口味?

答案

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

你可以这样做

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

插件版本3.0.0在这些位置搜索json文件(考虑到你有flavor flavor1和构建类型debug):

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

即使使用flavorDimensions,这对我也有用。我在一个方面有免费和付费,在另一个方面有Mock&Prod。我还有3个buildTypes:debug,release和staging。这就是我在FreeProd风格的项目中的样子:

enter image description here

google-services.json文件的数量取决于项目的特征,但每个Google项目至少需要一个json文件。

如果你想了解这个插件对这些json文件做什么的更多细节,请点击:https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720

链接到官方文档:https://developers.google.com/android/guides/google-services-plugin

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

并转到此处查看此插件的最新版本:https://bintray.com/android/android-tools/com.google.gms.google-services/view

另一答案

Firebase现在支持使用一个google-services.json文件的多个应用程序ID。

This blog post详细描述了它。

您将在Firebase中创建一个您将用于所有变体的父项目。然后,您可以在该项目的Firebase中为您拥有的每个应用程序ID创建单独的android应用程序。

当您创建所有变体时,可以下载支持所有应用程序ID的google-services.json。如果单独查看数据(即崩溃报告)是相关的,您可以使用下拉列表切换。

另一答案

基于@ 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。替换您使用的名称的风味名称。

另一答案

我发现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

另一答案

无需任何额外的gradle脚本。

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

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

所以,以下步骤足以让不同的google-services.json选择。

  1. 有2种口味
  2. 将新的dev flavor包添加到谷歌分析配置页面并下载google-services.json。
  3. 请注意,在新配置文件中,您的两个flavor的包ID都在那里
  4. 准备你的任何风味。

这就对了!..

另一答案

更新:

有关构建变体的Firebase设置,请参阅this blog,其中包含详细说明。

另一答案

谷歌服务插件的目的是简化谷歌功能的集成。

因为它只从google-services.json文件中生成android-resources,所以过度复杂的gradle-logic否定了这一点。

因此,如果Google-docs没有说明特定Google功能需要哪些资源,我建议为每个相关的构建类型/风格生成JSON文件,查看插件生成的资源,然后手动放置这些资源进入各自的src / buildtypeORflavor / res目录。

之后删除对google-services插件和JSON文件的引用,您就完成了。

有关google-services gradle-plugin内部工作方式的详细信息,请参阅我的其他答案:

https://stackoverflow.com/a/33083898/433421

另一答案

简化@Scotti的说法。您需要根据产品风格为特定项目创建具有不同包名称的Multiples应用程序。

假设您的项目是ABC,具有不同的产品风格X,Y,其中X的包名称为com.x,Y具有包名称com.y,然后在firebase控制台中,您需要创建项目ABC,您需要在其中创建2个应用程序包名称为com.x和com.y.然后你需要下载google-services.json文件,其中将有2个包含那些pacakges的客户端信息对象,你将会很高兴。

json的片段就是这样的

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

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

    }
另一答案

你有很多味道,所以这意味着你会有很多不同的包ID,对吗?因此,只需转到设置/生成json文件的页面并为每个包名配置。所有这些都将添加到json文件中。

我现在非常懒于发布图片,但基本上:

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

最后,您只需要一个json文件用于所有风格。

还有一个问题,你必须在注册获得注册令牌时进行测试,检查每种口味是否有区别。我不接触它,但它认为它应该是不同的。现在太晚了,我好困啊:)希望它有所帮助!

另一答案

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

另一答案

事实上,jazte在MyApp/app/目录中的google-services.json是好的,不需要与com.google.gms:google-services:3.0.0的aditional脚本。但要小心从应用程序目录google-services.json中删除文件MyApp/app/src/flavor1/res/以避免错误类型Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package

另一答案

更新:以下说明适用于一个Android Studio项目,该项目中包含一个Firebase项目和不同的Firebase应用程序。如果目标是在同一Android Studio项目中的不同Firebase项目中为不同的Firebase应用程序提供不

以上是关于google-services.json用于不同的productFlavors的主要内容,如果未能解决你的问题,请参考以下文章

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

我可以通过更改 google-services.json 为一个应用程序使用两个 Firebase 项目吗?

如何在不迁移到 Firebase 的情况下获取 google-services.json

google-services.json 的真正作用是啥?

使用复杂风味树更改 google-services.json 的搜索位置

将 google-services.json 提交到 GitHub