将 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.jsongoogle-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的主要内容,如果未能解决你的问题,请参考以下文章

google-services.json 的真正作用是啥?

如何在 Android 中添加 google-services.json?

google-services.json 用于不同的 productFlavors 和 buildTypes

无法在 google-services.json 中获取 firebase_url

google-services.json 找不到与任何模块的包名称匹配的客户端

在一个风格/目标中使用多个 google-services.json 和 GoogleService-Info.plist 文件