google-services.json用于不同的productFlavors

gen*_*tra 430 android google-cloud-messaging google-play-services

更新: 不推荐使用GCM,请使用FCM

我实施新的谷歌云消息之后从谷歌开发者页面的导游在这里

我已成功运行并测试它.但我现在的问题是我有不同的productFlavors具有不同的applicationId/packageName和不同的GCM项目ID.在google-services.json具有在被投入/app/google-services.json不是味道文件夹.

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

Yai*_*lka 478

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

你可以这样做

app/src/
    flavor1/google-services.json
    flavor2/google-services.json
Run Code Online (Sandbox Code Playgroud)

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

/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

  • googl-services.json是一个令人厌恶的...如何管理一些疯狂的json文件比插入API密钥和发件人ID更容易?请谷歌停止废话 (129认同)
  • 最新版本的配置文件生成器将多个属性放在同一个配置文件中,只需要在应用程序级别再使用一个属性,而不是在风格级别上单独的属性.您只需确保在相同的"应用程序名称"字段下生成两个配置. (19认同)
  • 由于某些原因,这对我不起作用 - 我得到了一个gradle构建错误 - 模块根文件夹中缺少文件google-services.json.如果没有它,Google Services Plugin就无法运行.因此,我每次都要通过构建脚本将flavor文件复制到根文件夹中. (12认同)
  • 从Android Studio 3.1.4开始,使用/app/src/flavor1/google-services.json不再有效。这些文件必须位于/app/src/flavor1/debug/google-services.json和/app/src/flavor1/release/google-services.json中。 (4认同)
  • 工作就像一个魅力,感谢上帝.谷歌服务.json这种使用他们的apis的全新方式似乎是倒退了一步.不知道这应该是多么容易. (2认同)
  • @runfaj,我根据你做了但我收到错误错误:任务执行失败':app:processClientDebugGoogleServices'.>找不到包名称'cl.dropcp.client.debug'的匹配客户端 (2认同)
  • 现在,插件在 json 文件中搜索以下位置: `/app/src/flavor1/google-services.json /app/src/debug/google-services.json /app/src/flavor1Debug/google-services.json /app /src/flavor1/debug/google-services.json /app/src/debug/flavor1/google-services.json /app/google-services.json` PS:gradle 版本为 3.5+ (2认同)

Sot*_*tti 63

更新:以下说明适用于一个Android Studio项目,该项目中包含一个Firebase项目和不同的Firebase应用程序.如果目标是在同一个Android Studio项目中为不同的Firebase项目中的不同Firebase应用程序提供不同的JSON文件,(或者如果您不知道有什么区别)请查看此处..

每个Android应用程序ID(通常是程序包名称)需要一个Firebase应用程序.每个Gradle构建变体有一个应用程序ID是常见的(如果您使用Gradle构建类型和Gradle构建样式,这将很可能)


Google Services 3.0开始,使用Firebase时,没有必要为不同的风格创建不同的文件.如果您拥有相互组合的productFlavours和Build类型,那么为不同的风格创建不同的文件可能不明确或不直接.

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

在Firebase控制台中,您需要为每个程序包名称添加一个应用程序.想象一下,你有2种风格(开发和实时)和2种构建类型(调试和发布).根据您的配置,但您可能有4个不同的包名称,如:

  • com.stackoverflow.example(live - release)
  • com.stackoverflow.example.dev(live - dev)
  • com.stackoverflow.example.debug(debug - release)
  • com.stackoverflow.example.dev.debug(debug - dev)

您需要在Firebase控制台中使用4种不同的Android应用.(在每一个上你需要为你正在使用的每台计算机添加SHA-1进行调试和实时)

当您下载google-services.json文件时,实际上它与您下载的应用程序无关,它们都包含与您的所有应用相关的相同信息.

现在,您需要在应用程序级别(app /)中找到此文件.

在此输入图像描述

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

痛点用作插件.为了使其正常工作,您需要在文件底部找到插件.所以这一行..

apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)

...需要位于app build.gradle文件的底部.

对于这里所述的大部分内容,它也适用于以前的版本.我从来没有为不同的配置提供不同的文件,但现在使用Firebase控制台更容易,因为它们提供了一个单独的文件,包含了所有配置所需的一切.

  • 这是一个非常好的答案,它应该是这个问题的唯一正确答案. (7认同)
  • 请注意,这仅适用于所有口味都在同一个firebase项目中的情况.如果使用多个项目(我倾向于在一个firebase项目中保留dev和stage,并在另一个google帐户中使用单独的专用prod项目),则需要Yair Kukielka概述的解决方案.实际上插件似乎支持各种路径 - 在构建过程中,你会得到一个关于插件寻找google-services.json文件的提示:"在查看[src/prod时找不到google-services.json/debug,src/debug/prod,src/prod,src/debug,src/prodDebug]" (6认同)

Zak*_*rdi 41

在这个问题上写了一篇中文帖子.

有一个类似的问题(使用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
}
Run Code Online (Sandbox Code Playgroud)

编辑:使用processDebugFlavorGoogleServices/ processReleaseFlavorGoogleServices任务以每个风味级别修改它.


ahm*_*_89 13

好吧,我遇到了同样的问题,无法得到任何完美的解决方案.这只是一种解决方法.我想知道谷歌如何不考虑口味......?我希望他们能尽快提出更好的解决方案.

我在做什么:

我有两种口味,每一种我都把相应的google-services.json:src/flavor1/google-services.jsonsrc/flavor2/google-services.json.

然后在构建gradle中,我根据flavor调整文件到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
}
Run Code Online (Sandbox Code Playgroud)

限制:每次要运行不同的风格时,您都必须myFlavor 手动更改gradle(因为它是硬编码的).

我尝试了很多方法来获得当前的构建风格,如afterEvaluate关闭......直到现在才能得到更好的解决方案.

更新,另一个解决方案:一个google-services.json用于所有风格:

您还可以为每种风格设置不同的软件包名称,然后在google开发人员控制台中,您不必为每种风格创建两个不同的应用程序,而只需在同一个应用程序中创建两个不同的客户端.然后你将只有一个google-services.json包含你的两个客户.当然,这取决于你如何实现你的口味的后端.如果他们没有分开,那么这个解决方案对你没有帮助.


小智 12

根据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 '.'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您不必手动切换设置.

  • 不起作用。无论构建风格如何,这都会运行两个复制命令,因此生产 json 始终位于 app 目录中。 (4认同)
  • 这不适用于构建类型 (2认同)
  • @ZakTaccardi,但问题是口味,而不是构建类型 (2认同)

div*_*nas 8

google-services.json文件不需要接收通知.只需为build.gradle文件中的每个flavor添加一个变量:

buildConfigField "String", "GCM_SENDER_ID", "\"111111111111\""
Run Code Online (Sandbox Code Playgroud)

注册时使用此变量BuildConfig.GCM_SENDER_ID而不是getString(R.string.gcm_defaultSenderId):

instanceID.getToken(BuildConfig.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 8

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

在JSON结构中有一个名为clients的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"
}
Run Code Online (Sandbox Code Playgroud)

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

对不起,紧凑的JSON数据.我无法正确格式化...


Eri*_*ric 8

  1. google-services.json从您的项目中删除现有的。
  2. 构建 > 清理项目
  3. 编译并运行您的应用程序
  4. 查看出现的错误消息,找出可以将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
    
    Run Code Online (Sandbox Code Playgroud)

注意:它还关心flavorDimensions. 我的是flavorDimensions "dev_suffix", "environment"


Dyn*_*ris 7

我知道,您对google-services.json文件should be put in the root app夹有疑问,是吗?我不一定会打破\xe2\x80\x94 的神话。您也可以将 google-services.json 文件放入其中flavor folder。像这样:

\n

在此输入图像描述

\n


Tus*_*dey 6

1.)google-services.json到底做了什么?

请遵循:https://stackoverflow.com/a/31598587/2382964

2.)google-services.json文件如何影响你的android studio项目?

请遵循:https://stackoverflow.com/a/33083898/2382964

简而言之,对于第二个网址,如果您在项目中添加google-services.json,则此路径中的变体 必须有自动生成的google-services文件夹debug

app/build/generated/res/google-services/debug/values/values.xml
Run Code Online (Sandbox Code Playgroud)

3.)做什么,完成它?

project_levelbuild.gradle中添加google-services依赖项,version 3.0.0如果您使用的是app_compact库,也可以使用.

// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'
Run Code Online (Sandbox Code Playgroud)

现在在app_levelbuild.gradle中你必须在底部添加.

// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)

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.


Dav*_*d P 6

根据Firebase 文档,您还可以使用字符串资源而不是google-services.json

由于此提供程序只是读取已知名称的资源,因此另一个选择是将字符串资源直接添加到您的应用程序中,而不是使用 Google Services gradle 插件。您可以通过以下方式执行此操作:

  • google-services从根 build.gradle 中删除插件
  • google-services.json从您的项目中删除
  • 直接添加字符串资源
  • 'com.google.gms.google-services'从应用程序 build.gradle 中删除 apply plugin:

例子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>
Run Code Online (Sandbox Code Playgroud)

  • 我很难匹配 google-services.json 文件中哪个键的值与相应的字符串等效,但后来我发现这有帮助:https://developers.google.com/android/guides/google-services-plugin#processing_the_json_file如果其他人有同样的问题。 (3认同)

Fal*_*asB 5

我们有一个不同的用于调试构建的包名 (*.debug),所以我想要一些基于风味和构建类型的东西,而不必在processDebugFlavorGoogleServices.

我在每种风格中创建了一个名为“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
                }
            }
    }
Run Code Online (Sandbox Code Playgroud)

当您切换构建变体时,它会自动将正确的 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 "";
}
Run Code Online (Sandbox Code Playgroud)

就是这样,您不必担心从 gradle 文件中删除/添加/修改口味,它会自动获取调试或发布 google-services.json。


bMc*_*ees 5

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

这篇博文详细介绍了它。

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

创建所有变体后,您可以下载支持所有应用程序 ID 的 google-services.json。当需要单独查看数据(即崩溃报告)时,您可以使用下拉菜单进行切换。