google-services.json到底做什么?


120

我致力于将Google Analytics(分析)和GCM服务添加到当前应用中。在两种服务实施指南中,Google要求开发人员生成一个json文件:google-services.json并将其放在应用程序的根目录下。

我发现,即使我从应用程序中删除了该json文件,该服务仍然有效。

只想确定一下,该文件的真正用途是什么?它的用法是什么以及如何工作?

Answers:


197

我对google-services插件和json进行了一些调查,找到了该插件的来源。

第一件事

由classpath引用并应用apply的gradle-plugin google-services仅是一个构建时插件!因此,它只会影响应用程序的构建过程,而不会影响运行时过程!

此插件仅是将Google服务快速集成到您的应用中的快速入门帮助程序。显然,该过程有些复杂且没有文档记录,因此Google应该明确该过程的作用。

实际上,我找到了插件版本com.google.gms:google-services:1.4.0-beta3的源代码,没有找到关于appinvites的任何特定参考,也没有找到任何Google for App Invites的API!(但也许它只是使用具有其项目ID的通用API项目,但我没有尝试过)

它能做什么

google-services gradle-plugin在您的应用程序模块中查找提到的google-services.json文件。然后,它会寻找配置的设置,例如由Google API开发者控制台生成到google-services.json文件中的project-id和tracking-id等。根据找到的设置,将Android资源值生成到以下路径:

$project.buildDir/generated/res/google-services/$variant.dirName/values/values.xml

例如,您的应用程序的调试版本:

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

例如,如果您遵循GCM教程,则JSON文件将包含API项目的ID,如下所示的android-resource:

<string name="gcm_defaultSenderId">project-id</string>

因此,此插件和JSON文件对于运行或发布您的应用程序不是必不可少的,它只是生成一些基本的android资源文件的快速入门帮助程序,可以更轻松地集成特定的Google API功能。

请注意,在下面引用的源代码中,google-services插件始终会为您的app / build.gradle中定义的每个应用程序变量生成那些android-resources。

如果您不希望这样做,则应在所需的应用变量中使用这些生成的资源,然后删除其他资源。不要忘记从app / build.gradle中删除适用于google-services的插件,否则它将为所有app-variant重新生成。

它没有

这个插件和JSON文件不会直接影响您应用的所说Google功能的内部运作!如果您已经按照developer.android.com上的旧教程进行了有关如何集成(例如GCM或Google Analytics(分析))的说明,那么您甚至都不需要集成gradle-plugin google-services或google-services.json文件!

关于我在哪里找到来源的通知

集成google-services gradle-plugin并同步项目后,Gradle会自动将google-services依赖项下载到与此类似的路径(在Windows上,您可能需要查看home / .gradle for Linux):

C:\Users\user\.gradle\caches\modules-2\files-2.1\com.google.gms\google-services\1.4.0-beta3\f1580f62e3be313eba041ce19b64fd3f44cf8951\google-services-1.4.0-beta3-sources.jar

如果解压缩此jar文件,则会找到两个文件:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

其中包含gradle-plugin的原始源代码。

GoogleServicesPlugin.groovy

包含app-variant的处理和路径的基本定义等。

GoogleServicesTask.java

包含实际的任务定义,请查找以下方法以查看其实际作用:

@TaskAction
public void action() throws IOException { 

2
更好的答案。但是,在尝试遵循推荐的方法(developers.google.com/analytics/devguides/collection/android/v4)时似乎会出现问题。“可接受的答案”是一个荒谬的SO概念,它完全取决于能够承受挑战的人的耐心决定……
axd

7
关于此的后续说明,因为自发布以来可能已更改。在谷歌服务摇篮插件指南指出该插件的第2个功能。它还声称为“已启用的服务所需的基本库”添加了一些依赖关系,并检查了依赖关系冲突(来自版本混合)。我研究了源代码,它似乎还注入了“ compile com.google.android.gms:play-services-measurement”。仅供参考,以防任何人看到该弹出窗口并且不确定原因。
Android3000 2016年

3
考虑到该文件包含几个键,将其添加到版本控制中是否安全?据我所知,这只是指纹,所以我认为它是安全的。但是我不确定。
exhuma

1
我个人认为@exhuma是一个私人或公司内部项目,可以将其检入版本控制。另一方面,显然,我绝不会将json文件检入开源项目的版本控制中。
arne.jans's

1
@ arne.jans是否可以动态设置senderId,或者只是将其硬编码在values.xml中?我需要从服务器动态获取senderId,而不是注册到FCM。
Bresiu

37

该文件的真正作用是:

google-services.json包含开发者凭据和配置设置,与GoogleApiClient连接时需要进行验证。尽管您的服务在检测您的开发人员帐户时可以在测试设备上正常运行,但是在公开发布您的应用后,如果没有json文件,该服务将无法正常工作。所以不要删除它。

官方文件说:

该应用程序构建一个GoogleApiClient,指定该应用程序将访问的范围和API。连接GoogleApiClient时,用户已登录。

请参阅工作原理部分。


3
谢谢您的回答。只是有疑问,但想知道您是否愿意提供帮助。我看到您的链接发布到了登录服务。但是,如果我仅在应用程序中使用Google Analytics(分析)和GCM服务,而无需登录,是否仍需要保留此文件?谢谢!
亚瑟·王

3
是的,对于分析或GCM,您还需要此配置文件。在文档的第2步中,您必须转到GET CONFIGURATION FILE链接。您必须在此处选择是否将此conf文件用于GCM或分析。该文件仅包含您的开发人员身份(如api密钥,开发pc的SHA1哈希等)
Mohammad Arman

2
@androidGuy对不起,请稍后回复。我认为您必须使用最新版本的SHA1密钥哈希创建新的配置google-services.json文件。否则,某些功能在Play商店上发布后可能无法使用。抱歉,您之前的困惑,我将删除之前的评论,因为它会让某人走错方向。
Mohammad Arman

1
如果您复制其他人的话,则必须正确地用引号引起引用并提供完整的署名。我回滚了您的编辑,因为我认为这是edit窃此答案的内容。
布拉德·拉尔森

6
那么安全性呢?可以重新创建google-services.json并从apk读取吗?我在里面看到一个开发人员和API密钥。我不喜欢被别人知道...
蒂诺

4

将google-services.json添加到您的模块中,然后执行CLEAN和A REBUILD。xml文件将使用您的项目属性在app / build / generate / res / google-services / debug / values / values.xml中生成,您可以像普通的xml字符串一样轻松地进行访问。例:

String serverClientId = getString(R.string.default_web_client_id);

google-service.json文档中有一个包含所有字符串和更多信息的列表

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.