Dmy*_*lyk 30 android gradle crashlytics android-studio android-gradle-plugin
当我试图与建设项目value的meta-data标签为字符串参考,crashlytics失败,以下错误:
Crashlytics found an invalid API key: @string/crashlytics.
Check the Crashlytics plugin to make sure that the application has been added successfully!
Contact support@crashlytics.com for assistance.
Run Code Online (Sandbox Code Playgroud)
不行
<meta-data
android:name="com.crashlytics.ApiKey"
android:value="@string/crashlytics"/>
Run Code Online (Sandbox Code Playgroud)
作品
<meta-data
android:name="com.crashlytics.ApiKey"
android:value="1234567890..."/>
Run Code Online (Sandbox Code Playgroud)
我想里面定义不同的密钥string.xml对不同的productFlavors我的Android项目.
写完崩溃支持后:
目前我们只能在构建时评估AndroidManifest.xml,因此我们不查看任何字符串资源,因此我们只支持硬编码字符串.我肯定会与你感兴趣的团队分享这个,所以我们可以在将来的版本中考虑支持这个.
a.b*_*cci 52
编辑:只有在使用旧版本的Crashlytics(我使用的是v1.1.11)时,接受的解决方案才有效.如果您使用的是Fabric SDK,您会注意到插件的任务已经发生了很大变化,下面的脚本将无法使用.此外,不再需要API密钥,因此您只需使用
<meta>清单中的API来指定API密钥以及在您的风格中定义的清单占位符:
在build.gradle中:
Run Code Online (Sandbox Code Playgroud)flavor1 { ... manifestPlaceholders = [crashlyticsApiKey: CRASHLYTICS_API_SECRET_HERE] ... }在AndroidManifest.xml中:
Run Code Online (Sandbox Code Playgroud)... <meta-data android:name="com.crashlytics.ApiKey" android:value="${crashlyticsApiKey}" /> ...
还有另一种未记录的方法来指定Crashlytics密钥,如此处所述,它是使用crashlytics.properties(在项目的根目录中)指定该值以及API密钥:
apiKey=YOUR_API_KEY
apiSecret=YOUR_API_SECRET
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不允许您crashlytics.properties为每种风格简单地指定不同的风格,因为它需要位于项目的根目录中才能被gradle插件正确选取.这意味着您需要动态生成该文件.我们的想法是将您的风格中的键/密钥值添加为自定义属性,并crashlytics.properties使用当前flavor中的值来生成at buildtime,以填充文件.
将build.gradle你的Android模块内部应该是这样的:
...
productFlavors {
flavor1 {
...
set("crashlyticsApiKey", CRASHLYTICS_API_KEY_HERE)
set("crashlyticsApiSecret", CRASHLYTICS_API_SECRET_HERE)
...
}
...
}
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 apiSecret for ${variant.name}"
properties.put("apiSecret", flavor.crashlyticsApiSecret)
println "...copying apiKey for ${variant.name}"
properties.put("apiKey", flavor.crashlyticsApiKey)
properties.store(new FileWriter(crashlyticsProperties), "")
}
generateResourcesTask.dependsOn generatePropertiesTask
def cleanResourcesTask = project.tasks.getByName("crashlyticsCleanupResourcesAfterUpload${variantSuffix}")
cleanResourcesTask.doLast {
println "...removing crashlytics.properties"
crashlyticsProperties.delete()
}
}
}
...
Run Code Online (Sandbox Code Playgroud)
基本上,脚本挂钩在构建过程中,并在Crashlytics gradle插件发挥其魔力之前生成/填充属性文件.
| 归档时间: |
|
| 查看次数: |
11948 次 |
| 最近记录: |