Crashlytics 在运行时未在 crashlytics.properties 中找到 API 密钥

Posted

技术标签:

【中文标题】Crashlytics 在运行时未在 crashlytics.properties 中找到 API 密钥【英文标题】:Crashlytics not finding API Key in crashlytics.properties at runtime 【发布时间】:2014-12-05 01:42:30 【问题描述】:

我目前正在实施建议的 API 密钥切换脚本 here,除了构建类型而不是风味。我的 build.gradle 看起来像这样:

...
buildTypes 
    debug 
        ...
        set("crashlyticsApiKey", "API_KEY_1")
        set("crashlyticsApiSecret", "API_SECRET_1")
    
    release 
        ...
        set("crashlyticsApiKey", "API_KEY_2")
        set("crashlyticsApiSecret", "API_SECRET_2")
    

...
productFlavors...
...
File crashlyticsProperties = new File("$project.projectDir.absolutePath/crashlytics.properties")

applicationVariants.all  variant ->
    variant.productFlavors.each  flavor ->
        def variantSuffix = variant.name.capitalize()
        def generateResourcesTask = project.tasks.getByName("crashlyticsGenerateResources$variantSuffix")
        def generatePropertiesTask = task("crashlyticsGenerateProperties$variantSuffix") << 
            Properties properties = new Properties()
            println "...copying apiKey for $variant.name"
            properties.put("apiKey", variant.buildType.crashlyticsApiKey)
            println "...copying apiSecret for $variant.name"
            properties.put("apiSecret", variant.buildType.crashlyticsApiSecret)
            properties.store(new FileWriter(crashlyticsProperties), "")
        
        generateResourcesTask.dependsOn generatePropertiesTask
        def cleanResourcesTask = project.tasks.getByName("crashlyticsCleanupResourcesAfterUpload$variantSuffix")
        cleanResourcesTask.doLast 
            println "...removing crashlytics.properties"
            crashlyticsProperties.delete()
        
    

...

gradle 文件构建成功,crashlytics.properties 会根据构建类型更新正确的信息。这种使用 crashlytics.properties 的方法被建议 here,并且除了在 gradle 文件中包含依赖项之外,似乎无需任何其他更新即可工作。但是,当从主活动调用 Crashlytics.start(this) 时,我得到一个运行时异常:

java.lang.RuntimeException: Unable to create application com.lookout.LookoutApplication: java.lang.IllegalArgumentException: Crashlytics could not be initialized, API key missing from androidManifest.xml. Add the following tag to your Application element
<meta-data android:name="com.crashlytics.ApiKey" android:value="YOUR_API_KEY"/>

将其分解为静态 crashlytics.properties 文件(即删除 gradle 文件中的动态脚本并在 crashlytics.properties 中仅包含一个 apiKey 和 apiSecret)会产生相同的错误,即使它构建成功。

我应该对 AndroidManifest 或 build.gradle 文件进行一些更改以将其指向 crashlytics.properties 吗?

【问题讨论】:

【参考方案1】:

适用于:

# Fabric properties file: app/fabric.properties
apiSecret=xx68f6074dxxxxxc11dxxx97c172e8ebf0
apiKey=xxxe76c4xxxx97e8cxxxx0135e9d46f5a2xxx

添加 .gitignore(用于开源项目)

REMOVE AndroidManifest.xml 中的条目:

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

官方文档:https://docs.fabric.io/android/fabric/settings/working-in-teams.html#android-projects

【讨论】:

无法使用 fabric.properties。仍然收到由于缺少清单条目而无法初始化结构的消息【参考方案2】:

虽然这不是原始问题的答案(因为 Instant Run 在 2014 年不存在),但您可能会发现 Instant Run 可能会导致问题。我的过程是:

安装 Fabric 插件 生成 Crashlytics 代码(包括清单中的 API 密钥) 切换到fabric.properties文件 花一个小时弄清楚为什么它不起作用 禁用 Instant Run -> 重建 -> 安装 -> 成功

我使用的是 Android Studio 2.0.0-beta6。这可能会在未来得到解决,但这是我可以在网上找到的唯一一个有同样问题的资源,所以希望我能在那个小时拯救其他人。

【讨论】:

禁用 InstantRun 为我解决了这个问题。希望我能在花一个小时尝试预言之前找到这篇文章。

以上是关于Crashlytics 在运行时未在 crashlytics.properties 中找到 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

禁用“答案”但不禁用“Crashlytics”

系统互斥体的 AbandonedMutexException 在第一次运行被杀死时未在第二次运行中捕获

导航到另一个 xib 时未在 AppKit(主)线程问题上运行

Crashlytics 未在“存档”模式下上传符号

Firebase Crashlytics 未在门户上显示任何问题

Firebase crashlytics 未在 iOS 中初始化