谷歌服务的json文件到底是做什么用的?

134
我正在为我的应用添加Google Analytics和GCM服务。在两种服务的实现指南中,谷歌要求开发人员生成一个json文件:google-services.json,并将其放置在应用程序的根目录下。
我发现即使从我的应用程序中删除了这个json文件,这些服务仍然可以正常工作。
只想确定一下,这个文件到底是干什么用的?它的使用方式是什么?它是如何工作的?
3个回答

216

我调查了一下关于google-services插件和json的内容,并找到了该插件的源代码。

先说重点

被classpath引用的gradle-plugin google-services以及使用apply应用的是一个仅在构建时使用的插件!因此它只影响您的应用程序构建过程,但不影响运行时进程!

这个插件只是作为一个快速启动助手,快速集成Google服务到您的应用程序中。显然,这个过程有些复杂,而且没有文档记录,所以Google应该明确说明这个过程的作用。

实际上,我找到了插件版本com.google.gms:google-services:1.4.0-beta3的源代码,并没有发现任何关于appinvites的具体参考,也没有找到任何Google API关于应用邀请的相关信息!(但也许它只是使用通用API项目和其项目ID,我没有尝试)

它是做什么的?

google-services gradle插件会在您的应用模块中寻找所提到的google-services.json文件,然后查找由Google API开发者控制台生成,并配置的设置,例如项目ID和跟踪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资源。

如果您不想要这样做,您应该在您想要的应用程序变体中使用那些生成的资源,并删除其他资源。不要忘记从app/build.gradle中删除google-services插件应用,否则它将重新生成所有应用程序变体。

它不会产生的影响

此插件和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插件的源代码。

GoogleServicesPlugin.groovy

包含应用程序变体的处理和路径等基本定义。

GoogleServicesTask.java

包含实际任务定义,查找以下方法以了解其真正作用:

@TaskAction
public void action() throws IOException { 

2
虽然按照推荐的方法(https://developers.google.com/analytics/devguides/collection/android/v4/)进行操作,但似乎仍存在问题。“被采纳的答案”是一个荒谬的SO概念,完全取决于能够决定它的人的耐心... - axd
8
关于此事的跟进说明,因为您发布这篇文章后可能已经发生了变化。 Google服务Gradle插件指南陈述了该插件的第二个功能。它还声称会添加一些依赖项,以支持您启用的服务所需的“基本库”,并检查依赖项冲突(来自版本混合)。我查看了源代码,还发现它注入了“compile com.google.android.gms:play-services-measurement” 。如果有人看到这样的内容并不确定原因,请注意这一点。 - Android3000
3
这个文件中包含几个密钥,将其添加到版本控制是否安全?据我所知,这些只是指纹信息,所以我认为是安全的。但我并不能完全确定。 - exhuma
1
在我个人看来,如果您正在处理私人或公司内部项目,将其检入版本控制是可以的。另一方面,对于开源项目,我显然不会将json文件检入版本控制。 - arne.jans
1
@arne.jans 你能动态设置senderId吗,还是只是在values.xml中硬编码了?我需要从服务器动态获取senderId,然后注册到FCM。 - Bresiu
显示剩余2条评论

40

这个文件的作用是什么:

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

官方文档说:

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

请参见how it works部分。


3
谢谢您的回答。我有一些问题,想知道您是否愿意帮忙解答。我看到您提供的链接是关于登录服务的。但如果我在我的应用程序中只使用Google Analytics和GCM服务,并没有需要登录的功能,那么我是否仍然需要保留这个文件呢?谢谢! - Arthur Wang
3
对于分析或GCM,您也需要此配置文件。在文档的第2步中,您需要转到“获取配置文件”链接。然后,您需要选择是将此配置文件用于GCM还是分析。此文件仅包含开发者身份(如API密钥、开发PC的SHA1哈希等)。 - Mohammad Arman
2
@androidGuy 对于回复晚了我很抱歉。我认为你需要创建一个新的配置google-services.json文件,并附带最新发布的SHA1密钥哈希值。否则,在应用程序发布到Google Play商店后,某些功能可能无法正常工作。对于之前的混淆问题我也很抱歉,我将删除之前的评论,以免让他人产生错误方向。 - Mohammad Arman
1
如果你复制了别人的文字,你必须适当地引用并提供完整的归属。我已经回滚了你的编辑,因为我认为这是对下面答案的剽窃。 - Brad Larson
6
安全问题怎么样?google-services.json文件能否从apk中重建和读取?我看到其中包含了开发者和API密钥,我不希望这些信息被他人知道... - Tino
显示剩余11条评论

5
将google-services.json添加到您的模块中,然后进行清理和重建操作。 在app/build/generated/res/google-services/debug/values目录下会生成一个xml文件,其中包含您项目的属性,您可以像处理普通xml字符串一样轻松访问它们。 例如:
String serverClientId = getString(R.string.default_web_client_id);

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


google-service.json 文件中 oauth-client 的作用是什么? - sejn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接