这是一个自我回答的问题,分享我的知识.
我有一个具有多种产品口味的项目,我希望使用不同的组织为每种产品风格整合Fabric.
我尝试使用Android Studio Fabric插件集成Fabric.它补充道
进入AndroidManifest.xml
的main
源集合.
我决定在应用程序变体特定的源集中重写此条目:
然后我发现Fabric Gradle插件crashlytics.properties
在构建期间生成带有fabric api secret(AKA build secret)的文件,我应该将此文件包含在源代码控制中.但是每次构建特定的应用程序变体时都会覆盖此文件,因为api secret对于每个应用程序都是唯一的.
如何针对每种应用程序变体使用单独的组织集成Fabric?
在fabricGenerateResources
调用构建任务期间,它会查找fabric.properties
以下列内容命名的文件:
apiSecret=YOUR_BUILD_SECRET apiKey=YOUR_API_KEY
所以我们需要的是fabric.properties
在此之前生成文件.
我找到了这个解决方案,稍微对其进行了修改,以完全支持不仅构建类型的应用程
将此代码添加到以下android
部分build.gradle
:
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());
如果您不反对使用应用程序ID后缀,则不需要单独的组织.崩溃和答案将被视为单独的应用程序.
例如,假设我的应用程序ID是 io.example
在build.gradle中:
buildTypes { debug { applicationIdSuffix ".debug" } release { //options } }
将调试版本部署到设备或模拟器后,在Fabric站点上,您将看到两个应用程序:
io.example
io.example.debug
有一件事情是好的这个方法是,你还可以跟踪其他构建口味seprately: ,io.exmaple.free
,io.exmaple.paid
,io.example.exterprise
等等.