gpt4 book ai didi

android - Crashlytics (Fabric) 为应用程序变体(构建类型、产品风格)分离组织

转载 作者:IT老高 更新时间:2023-10-28 21:46:47 24 4
gpt4 key购买 nike

这是一个 self 回答的问题,分享我的知识。

我有一个包含多种产品风格的项目,我想为每种产品风格使用不同的组织来集成 Fabric。

我尝试使用 Android Studio Fabric 插件集成 Fabric。它增加了

<meta-data
android:name="io.fabric.ApiKey"
android:value="DEFAULT_ORGANIZATION_API_KEY" />

main 源集的AndroidManifest.xml 条目。

我决定在应用程序变体特定的源集中重写此条目:

<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>

然后我发现 Fabric Gradle 插件在构建过程中生成了 crashlytics.properties 文件,其中包含 Fabric api key (AKA 构建 key ),我应该将此文件包含在源代码管理中。但是每次我构建特定的应用程序变体时,这个文件都会被覆盖,因为每个应用程序的 api secret 都是唯一的。

如何为每个应用程序变体使用不同的组织来集成 Fabric?

最佳答案

在构建过程中调用 fabricGenerateResources 任务并查找名为 fabric.properties 的文件,其内容如下:

apiSecret=YOUR_BUILD_SECRET
apiKey=YOUR_API_KEY

所以我们只需要在此之前生成 fabric.properties 文件。

我找到了 this solution并对其稍作修改以完全支持应用程序变体,而不仅仅是构建类型。

将此代码添加到 build.gradleandroid 部分:

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 插件生成应用程序资源后删除此文件的任务。

您现在只需要定义产品风格或构建类型特定的 fabricApiKeyfabricApiSecret:

productFlavors {
flavor1 {
ext.fabricApiKey = "FLAVOR1_API_KEY"
ext.fabricApiSecret = "FLAVOR1_API_SECRET"
}
}

extExtraPropertiesExtention每个 ExtensionAware 提供的对象目的。它允许将新属性添加到现有对象。在我的例子中 flavor1ExtensionAware 对象,它可以通过使用 ext.someProperty = "value" 语法和后来的这些属性来扩展新属性可以用作flavor.someProperty, flavor.fabricApiKey

另外最好将 fabric.properties 包含到 .gitignore

如果您在调试期间使用它来禁用 Crashlytics,请不要忘记从调试构建类型中删除 ext.enableCrashlytics = false。取而代之的是,您可以在 Application.onCreate 中禁用它:

Fabric.with(this, new Crashlytics.Builder().core(
new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());

关于android - Crashlytics (Fabric) 为应用程序变体(构建类型、产品风格)分离组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34462065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com