mix*_*xel 32 android gradle crashlytics android-productflavors twitter-fabric
这是一个自我回答的问题,分享我的知识.
我有一个具有多种产品口味的项目,我希望使用不同的组织为每种产品风格整合Fabric.
我尝试使用Android Studio Fabric插件集成Fabric.它补充道
<meta-data
android:name="io.fabric.ApiKey"
android:value="DEFAULT_ORGANIZATION_API_KEY" />
Run Code Online (Sandbox Code Playgroud)
进入AndroidManifest.xml的main源集合.
我决定在应用程序变体特定的源集中重写此条目:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<meta-data
android:name="io.fabric.ApiKey"
android:value="SECOND_ORGANIZATION_API_KEY"
tools:replace="android:value" />
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
然后我发现Fabric Gradle插件crashlytics.properties在构建期间生成带有fabric api secret(AKA build secret)的文件,我应该将此文件包含在源代码控制中.但是每次构建特定的应用程序变体时都会覆盖此文件,因为api secret对于每个应用程序都是唯一的.
如何针对每种应用程序变体使用单独的组织集成Fabric?
mix*_*xel 27
在fabricGenerateResources调用构建任务期间,它会查找fabric.properties以下列内容命名的文件:
apiSecret=YOUR_BUILD_SECRET
apiKey=YOUR_API_KEY
Run Code Online (Sandbox Code Playgroud)
所以我们需要的是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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
它迭代应用程序变体,并为每个应用程序变体创建任务,生成fabric.properties在Fabric Gradle插件生成应用程序资源后删除此文件的文件和任务.
您现在需要的只是定义产品风味或特定的构建类型,fabricApiKey并且fabricApiSecret:
productFlavors {
flavor1 {
ext.fabricApiKey = "FLAVOR1_API_KEY"
ext.fabricApiSecret = "FLAVOR1_API_SECRET"
}
}
Run Code Online (Sandbox Code Playgroud)
ext是每个ExtensionAware对象提供的ExtraPropertiesExtention对象.它允许将新属性添加到现有对象.在我的例子中是对象,它可以通过使用语法扩展新属性,以后可以使用这些属性.flavor1ExtensionAwareext.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());
Run Code Online (Sandbox Code Playgroud)
如果您不反对使用应用程序ID后缀,则不需要单独的组织.崩溃和答案将被视为单独的应用程序.
例如,假设我的应用程序ID是 io.example
在build.gradle中:
buildTypes {
debug {
applicationIdSuffix ".debug"
}
release {
//options
}
}
Run Code Online (Sandbox Code Playgroud)
将调试版本部署到设备或模拟器后,在Fabric站点上,您将看到两个应用程序:
io.exampleio.example.debug有一件事情是好的这个方法是,你还可以跟踪其他构建口味seprately: ,io.exmaple.free,io.exmaple.paid,io.example.exterprise等等.
| 归档时间: |
|
| 查看次数: |
6673 次 |
| 最近记录: |