在构建过程中,调用了fabricGenerateResources
任务,并查找名为fabric.properties
的文件,其内容如下:
apiSecret=YOUR_BUILD_SECRET
apiKey=YOUR_API_KEY
所以我们需要在此之前生成fabric.properties
文件。
我发现了这个解决方案,并进行了轻微修改,以完全支持应用程序变体而不仅仅是构建类型。
将此代码添加到build.gradle
的android
部分:
File crashlyticsProperties = new File("${project.projectDir.absolutePath}/fabric.properties")
applicationVariants.all { variant ->
variant.productFlavors.each { flavor ->
def variantSuffix = variant.name.capitalize()
def generatePropertiesTask = task("fabricGenerateProperties${variantSuffix}") << {
Properties properties = new Properties()
properties.put("apiKey", flavor.fabricApiKey)
properties.put("apiSecret", flavor.fabricApiSecret)
properties.store(new FileWriter(crashlyticsProperties), "")
}
def generateResourcesTask = project.tasks.getByName("fabricGenerateResources${variantSuffix}")
generateResourcesTask.dependsOn generatePropertiesTask
generateResourcesTask.doLast {
println "Removing fabric.properties"
crashlyticsProperties.delete()
}
}
}
它遍历应用程序变体,并为每个应用程序变体创建生成fabric.properties
文件的任务以及在Fabric Gradle插件生成应用程序资源后删除此文件的任务。
现在,您只需要定义特定于产品风格或构建类型的fabricApiKey
和fabricApiSecret
:
productFlavors {
flavor1 {
ext.fabricApiKey = "FLAVOR1_API_KEY"
ext.fabricApiSecret = "FLAVOR1_API_SECRET"
}
}
ext
是由每个ExtensionAware对象提供的一个ExtraPropertiesExtention对象,它允许向现有对象添加新属性。在我的情况下,flavor1
是一个ExtensionAware
对象,可以使用ext.someProperty = "value"
语法来扩展它,稍后这些属性可以作为flavor.someProperty,flavor.fabricApiKey
使用。
此外,最好将fabric.properties
包含在.gitignore
中。
如果您在调试期间使用了ext.enableCrashlytics=false
来禁用Crashlytics,请不要忘记从调试版本中删除它。相反,您可以在Application.onCreate
中禁用它:
Fabric.with(this, new Crashlytics.Builder().core(
new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());
ext.enableCrashlytics = false
才能生成那个 gradle 任务。现在正在测试它。我有一个问题,就是 fabric.properties 中的 apiKey 是如何工作的?这是否替代了在 AndroidManifest.xml 中拥有它的必要性? - Jeff Lockhartbuild.gradle
文件? - mixel