google-services.json 的真正作用是啥?
Posted
技术标签:
【中文标题】google-services.json 的真正作用是啥?【英文标题】:What does google-services.json really do?google-services.json 的真正作用是什么? 【发布时间】:2015-10-14 09:12:48 【问题描述】:我致力于将 Google Analytics(分析)和 GCM 服务添加到我当前的应用中。 在这两种服务的实现指南中,google 要求开发者生成一个 json 文件:google-services.json 并将其放在应用程序的根目录下。
我发现即使我从我的应用程序中删除了这个 json 文件,服务仍然有效。
只是想确定一下,这个文件的真正用途是什么?它的用途和工作原理是什么?
【问题讨论】:
【参考方案1】:这个文件的真正用途:
google-services.json 包含开发人员凭据和配置设置,在连接 GoogleApiClient 时需要进行验证。尽管您的服务在检测您的开发者帐户时可以在您的测试设备上正常工作,但是在公开发布您的应用程序后,如果没有 json 文件,它将无法工作。所以不要删除它。
官方文档说:
应用程序构建一个 GoogleApiClient,指定应用程序将访问的范围和 API。当 GoogleApiClient 连接时,用户已登录。
请参阅how it works 部分。
【讨论】:
感谢您的回答。只是有问题,但想知道您是否愿意提供帮助。我看到您的链接发布到登录服务。但是如果我只在我的应用程序中使用 Google Analytics 和 GCM 服务,不需要登录,我还需要保留这个文件吗?谢谢! 是的,对于分析或 GCM,您还需要此配置文件。在文档的第 2 步中,您必须转到 GET A CONFIGURATION FILE 链接。您必须在此处选择是否将此 conf 文件用于 GCM 或分析。该文件仅包含您的开发者身份(如 api 密钥、您的开发电脑的 SHA1 哈希等) @androidGuy 抱歉回复晚了。我认为您必须使用最新版本的 SHA1 密钥哈希创建新的配置 google-services.json 文件。否则,某些功能在 Play 商店发布后可能无法使用。抱歉之前的混乱,我将删除我之前的评论,因为它会让某人走错方向。 如果您复制他人的话,您必须正确地屏蔽引用并提供完整的出处。我已经回滚了你的编辑,因为我认为这是对下面这个答案的抄袭。 安全性怎么样?可以从 apk 重新创建和读取 google-services.json 吗?我在里面看到了一个开发者和 API 密钥。我不喜欢被别人知道...【参考方案2】:我对 google-services 插件和 json 进行了一些调查,并找到了该插件的来源。
首要任务
classpath 和 apply 引用的 gradle-plugin google-services 只是一个构建时插件!所以它只影响你的应用程序的构建过程,而不影响运行时过程!
此插件仅用作快速启动助手,以在您的应用中快速集成 Google 服务。显然,该过程有些复杂且没有记录,因此 Google 应该明确说明此过程的作用。
事实上,我找到了插件版本 com.google.gms:google-services:1.4.0-beta3 的源代码,但没有找到任何关于 appinvites 的具体参考资料,也没有找到任何 Google API for App Invites ! (但也许它只是使用带有项目 ID 的通用 API 项目,我没有尝试过)
它的作用
google-services gradle-plugin 在您的应用程序模块中查找提到的 google-services.json 文件。然后,它会在 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-resource 文件以便更轻松地集成特定 Google API 功能的快速入门助手。
请注意下面引用的源代码中,google-services 插件始终为您的 app/build.gradle 中定义的每个 app-variant 生成这些 android-resources。
如果您不希望这样,您应该在所需的应用程序变体中使用这些生成的资源,并删除其他资源。不要忘记从 app/build.gradle 中删除 google-services 插件应用,否则它将为所有 app-variants 重新生成。
它没有什么
此插件和 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
包含应用程序变体的处理和路径的基本定义等。
GoogleServicesTask.java
包含实际的任务定义,寻找下面的方法看看它到底做了什么:
@TaskAction
public void action() throws IOException
【讨论】:
更好的答案。然而,在尝试遵循推荐的方法时似乎存在问题 (developers.google.com/analytics/devguides/collection/android/v4) “接受的答案”是一个荒谬的 SO 概念,完全取决于可以决定它的人的耐心...... 关于此的后续说明,因为自从您发布此内容后它可能已更改。 Google Services Gradle Plugin 指南说明了插件的第二个功能。它还声称为“您启用的服务所需的基本库”添加了一些依赖项,以及检查依赖项冲突(来自版本混合)。我挖掘了源代码,它似乎也注入了“compile com.google.android.gms:play-services-measurement”。仅供参考,以防有人看到该弹出窗口但不确定原因。 考虑到该文件包含几个键,将其添加到版本控制中是否安全?据我所知,它只是指纹,所以我认为它是安全的。但我并不完全确定。 @exhuma 在我个人看来,如果您正在从事私人或公司内部项目,可以将其签入版本控制。另一方面,很明显,我永远不会将 json 文件检查到开源项目的版本控制中。 @arne.jans 您是否能够动态设置 senderId,或者您只是将其硬编码在 values.xml 中?我需要从服务器动态获取 senderId,然后注册到 FCM。【参考方案3】:将 google-services.json 添加到您的模块并执行 CLEAN 和 A REBUILD。 将在 app/build/generated/res/google-services/debug/values/values.xml 中使用您的项目属性生成一个 xml 文件,您可以像普通的 xml 字符串一样轻松访问。 示例:
String serverClientId = getString(R.string.default_web_client_id);
google-service.json doc 中有一个包含所有字符串和更多信息的列表
【讨论】:
google-service.json文件中的oauth-client有什么用以上是关于google-services.json 的真正作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用复杂风味树更改 google-services.json 的搜索位置
将 google-services.json 提交到 GitHub
生成 google-services.json 时 SHA 密钥冲突的问题
为了解决“google-services.json 丢失”问题,我应该在 Flutter 应用程序中的啥位置放置 Googleservices.json