【问题标题】:What is the best way to hide Crashlytics key?隐藏 Crashlytics 密钥的最佳方法是什么?
【发布时间】:2017-08-01 03:45:53
【问题描述】:

我将 crashlytics 密钥放在 xml 中,但出现此错误:

错误:任务“:app:fabricGenerateResourcesDebug”执行失败。

Crashlytics 开发者工具错误。

以下是我在AndroidManifest.xml 中的预期代码。

<meta-data
    android:name="io.fabric.ApiKey"
    android:value="@string/crashlytics_key" />

隐藏它的最佳方法是什么?

【问题讨论】:

  • 您为什么要从存储库中隐藏密钥?如果您不能信任有权访问您的代码的开发人员,那么您将遇到比他们拥有密钥更大的问题。如果您担心将来会有不满的员工,您可以根据需要刷新 API 密钥。
  • 这是一个公共回购
  • 啊,有道理。那么为什么不在 repo 上有一个虚拟密钥(并在自述文件中澄清)?
  • 但是,这意味着每次我想提交时,我都需要记住自己将我的 api 密钥替换为虚拟密钥。如果我把它放在另一个文件中,我可以把那个文件放在.gitignore 中,我可以像往常一样继续开发。
  • 这应该可以工作了:developer.android.com/studio/build/… -- 你可以从一个像 local.properies(使用 Groovy)这样的文件中提取变量,但它没有被提交,然后将它注入到清单中

标签: android crashlytics


【解决方案1】:

没有必要像接受的答案那样复杂。

根据the official docs,您可以简单地从Manifest 中删除您的API 密钥并放入fabric.properties 文件,您的秘密已经存在于下一个形式中:

apiKey=fabric_api_key
apiSecret=fabric_api_secret

就是这样。 Fabric 插件(或 Gradle 任务)将自动在引擎盖内完成所有需要的工作。

附:不要忘记将您的 fabric.properties 文件保存在版本控制系统之外

【讨论】:

    【解决方案2】:

    将您的 API 密钥放在 local.properties 中。

    crashlytics.key=api_key_here
    

    在你的 build.gradle 中,添加这个 Groovy 方法:

    def getLocalProperty(String propertyName) {
        def propsFile = rootProject.file('local.properties')
        if (propsFile.exists()) {
            def props = new Properties()
            props.load(new FileInputStream(propsFile))
            return props[propertyName]
        } else {
            return ""
        }
    }
    

    然后添加一个manifest占位符,例如:

    android {
        defaultConfig {
            manifestPlaceholders = [crashlytics:getLocalProperty("crashlytics.key")]
        }
    }
    

    在您的清单中,您现在可以使用以下语法将 API 密钥作为注入变量访问:

    ${crashlytics}
    

    您可能需要调整此代码以使其满足您的需求,但这应该足以让您开始。并确保将 local.properties 添加到您的 .gitignore 中(如果还没有的话!)希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      好吧,将两个密钥都放在fabric.properties 对我不起作用,fabric 无法在那里找到 api 密钥,我想把它放在 Manifest 中。然后我发现了这个解决方案:

      地点io.fabric.ApiKey=676897890789790... 给你的local.properties

      在 AndroidManifest 中添加:

      <meta-data
                  android:name="io.fabric.ApiKey"
                  android:value="@string/fabric_api_key" />
      

      然后在应用模块build.gradle

      Properties properties = new Properties()
      properties.load(project.rootProject.file('local.properties').newDataInputStream())
      def fabricApiKey = properties.getProperty('io.fabric.ApiKey')
      if (fabricApiKey == null) fabricApiKey = "Place io.fabric.ApiKey to local.properties"
      

      然后在 defaultConfig 闭包中:

      defaultConfig {
         .....
               resValue "string", "fabric_api_key", fabricApiKey
          }
      

      通过这种方式,您还可以从开源项目的源代码控制中隐藏 google maps 密钥,并且仍然保持应用程序可构建以用于持续集成或想要尝试它的人们...

      【讨论】:

        猜你喜欢
        • 2011-11-18
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 2011-03-29
        • 2020-10-05
        • 1970-01-01
        相关资源
        最近更新 更多