Crashlytics(Fabric)针对应用程序变体(构建类型,产品风格)分离组织

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.xmlmain源集合.

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

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


Dav*_*sen 8

如果您不反对使用应用程序ID后缀,则不需要单独的组织.崩溃和答案将被视为单独的应用程序.

例如,假设我的应用程序ID是 io.example

在build.gradle中:

buildTypes {
  debug {
    applicationIdSuffix ".debug"
  }
  release {
    //options
  }
}
Run Code Online (Sandbox Code Playgroud)

将调试版本部署到设备或模拟器后,在Fabric站点上,您将看到两个应用程序:

  • io.example
  • io.example.debug

有一件事情是好的这个方法是,你还可以跟踪其他构建口味seprately: ,io.exmaple.free,io.exmaple.paid,io.example.exterprise等等.

  • @CerlinBoss这是一个不同的错误.您尚未为此"新"应用设置Google API..debug是一个新的应用程序! (2认同)