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 密钥的主要内容,如果未能解决你的问题,请参考以下文章
系统互斥体的 AbandonedMutexException 在第一次运行被杀死时未在第二次运行中捕获
导航到另一个 xib 时未在 AppKit(主)线程问题上运行