将 google-services.json 提交到 GitHub
Posted
技术标签:
【中文标题】将 google-services.json 提交到 GitHub【英文标题】:Commiting google-services.json to GitHub 【发布时间】:2016-03-19 00:19:17 【问题描述】:我正在创建一个公共 android 项目,并且正在使用 Google 登录服务。我是按照this tutorial 做的。正如它所说,我有 google-services.json 文件。
我需要将上述文件提交到 Github 吗? 其他开发人员(如果有人贡献)是否需要此文件? 或者,他们必须在那里创建自己的吗? 顺便说一下,我使用的是 Travis-CI。此文件会影响 CI 构建吗?【问题讨论】:
它对我来说确实是一个相当重要的文件。 是的,但是我需要将该文件提交到 Github 吗?由于它包含我的谷歌应用程序 ID 和东西,这是否意味着其他开发人员也应该为自己生成它? 如果它包含您的敏感数据并且Travis需要它来构建它,您可以file encrypt它。如果它不包含敏感数据并且需要,请添加它。在所有其他情况下,请忽略它。 (如果 Android 存储库添加了它并做同样的事情,我也会环顾四周) Google is not recommending包括 google-services.json 仅适用于开源项目的源代码控制:“对于开源项目,我们通常不建议将应用程序的 Firebase 配置文件或对象包含在源代码控制,因为在大多数情况下,您的用户应该创建自己的 Firebase 项目并将他们的应用指向他们自己的 Firebase 资源(通过他们自己的 Firebase 配置文件或对象)。" 【参考方案1】:您可以创建一个新的build variant 并存储一个模板google-services.json
用于在您的应用程序build.gradle
中构建您的CI 平台。
为新的dev
构建变体使用不同的google-services.json
(请参阅this post)。将以下google-services.json
模板添加到app/src/dev
folder :
"project_info":
"project_number": "",
"project_id": ""
,
"client": [
"client_info":
"mobilesdk_app_id": "1:123456789012:android:1234567890123456",
"android_client_info":
"package_name": "com.your.package"
,
"oauth_client": [
"client_id": "",
"client_type": 3
,
"client_id": "",
"client_type": 1,
"android_info":
"package_name": "com.your.package",
"certificate_hash": ""
],
"api_key": [
"current_key": ""
],
"services":
"analytics_service":
"status": 2,
"analytics_property":
"tracking_id": ""
,
"appinvite_service":
"status": 1,
"other_platform_oauth_client": []
,
"ads_service":
"status": 1
],
"configuration_version": "1"
请注意,如果您还使用 Google Analytics 或 GCM 服务,我已扩展此 google-services。
您将拥有以下配置:
app/
├── src/
│ ├── main/
│ └── dev/
│ └── google-services.json
├── google-services.json
└── build.gradle
你可以使用任何一个:
一种新的构建类型 一种新的产品风味(如果您已经有现有的)构建类型
添加以下构建类型:
buildTypes
dev
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
我们不需要在常规构建中构建这个“dev”构建变体,所以如果没有指定参数,你可以排除这个变体。将以下内容添加到您的应用中 build.gradle
:
def build_param = "$build";
if (build_param != "dev")
//exclude production build
android.variantFilter variant ->
if (variant.buildType.name.equals('dev'))
variant.setIgnore(true);
else
//exclude all except production build
android.variantFilter variant ->
if (!variant.buildType.name.equals('dev'))
variant.setIgnore(true);
产品风味
将dev
产品风格添加到现有产品风格中:
productFlavors
full
dev
要从常规构建中删除此 dev
产品风味:
def build_param = "$build";
if (build_param != "dev")
//exclude dev
android.variantFilter variant ->
if (variant.getFlavors().get(0).name.equals('dev'))
variant.setIgnore(true);
else
//exclude all but dev
android.variantFilter variant ->
if (!variant.getFlavors().get(0).name.equals('dev'))
variant.setIgnore(true);
最后,将您的应用模块 google-services.json
添加到 .gitignore
:
app/google-services.json
我们之前已确保仅在指定参数build=dev
时才会使用此dev
变体
编辑.travis.yml
以修改构建配置:
script:
- ./gradlew clean build -Pbuild=dev
-Pbuild=dev
只会使用位于app/src/dev/google-services.json
的google-services.json
构建开发版本变体
看看使用google-services Google project的this sample project
在Travis log 中,您可以看到正在解析的JSON 文件是dev
构建变体的文件:
Parsing json file: /home/travis/build/bertrandmartel/android-googlesignin/app/src/dev/google-services.json
补充说明
请注意,此方法不限于 CI,当您需要生产 google-services.json
或不同的 AndroidManifest.xml
(具有某些特定属性,如 fabric.io 键)时,可以将其扩展到您的生产构建
检查this method 以防止提交嵌入在 AndroidManifest.xml 中的结构密钥(并且不能从 gradle 导入)使用不同的构建变体并使用参数来启用生产构建。
【讨论】:
【参考方案2】:你可以使用travis encrypt-file google-services.json
Documentation
你可以这样做:
通过运行$ gem install travis
安装了 Travis CI 命令行客户端。
使用 $ travis login
或 $ travis login --pro
登录 Travis CI
$ travis encrypt-file super_secret.txt
encrypting super_secret.txt for rkh/travis-encrypt-file-example
storing result as super_secret.txt.enc
storing secure env variables for decryption
然后它将在控制台上打印:
openssl aes-256-cbc -K $encrypted_0a6446eb3ae3_key -iv $encrypted_0a6446eb3ae3_iv -in super_secret.txt.enc -out super_secret.txt -d
您可以将其复制到您的 .travis.yml
文件中,就像我在 here 中所做的那样
不要忘记将您的 .enc
文件放在您的 GitHub 存储库中。
如果您有多个文件,您可以将它们压缩,然后在 Travis ci 上解压缩解密的文件。
例如,您可以这样做:
$ tar cvf secrets.tar foo bar
$ travis encrypt-file secrets.tar
$ vi .travis.yml
$ git add secrets.tar.enc .travis.yml
$ git commit -m 'use secret archive'
$ git push
我做到了。
就我而言,我有两个文件可用于构建我的应用程序。所以,我使用了this,因为 travis 不支持多个加密文件。因此,您将其压缩到一个文件上并加密该文件。
你可以看看我的 travis 脚本here
【讨论】:
【参考方案3】:Firebase 文档似乎暗示将文件提交到 GitHub 没有问题。
这是the docs的摘录
Firebase 配置文件包含您项目的唯一但非机密标识符。要了解有关此配置文件的更多信息,visit Understand Firebase Projects.
【讨论】:
【参考方案4】:Firebase 文档说:
“对于开源项目,我们通常不建议在源代码管理中包含应用的 Firebase 配置文件或对象,因为在大多数情况下,您的用户应该创建自己的 Firebase 项目并将其应用指向自己的 Firebase 资源(通过他们自己的 Firebase 配置文件或对象)。”
https://firebase.google.com/docs/projects/learn-more?authuser=0#config-files-objects
【讨论】:
以上是关于将 google-services.json 提交到 GitHub的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中添加 google-services.json?
google-services.json 用于不同的 productFlavors 和 buildTypes
无法在 google-services.json 中获取 firebase_url
google-services.json 找不到与任何模块的包名称匹配的客户端
在一个风格/目标中使用多个 google-services.json 和 GoogleService-Info.plist 文件