无法为 DEBUG 构建禁用 Fabric 的 Crashlytics with Firebase

Fabric's Crashlytics with Firebase can't be disabled for DEBUG builds

我有一个通过 Firebase 使用 Fabric 的 Crashlytics 的应用程序。 下面是在我的Applications onCreate

中执行的第一件事
CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
    .disabled(BuildConfig.DEBUG)
    .build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());

尽管如此,崩溃是在 DEBUG == true 模式下提交的。

我使用以下版本

在我的 build.gradle classpath "io.fabric.tools:gradle:1.25.1"

在我的 app/build.gradle implementation "com.crashlytics.sdk.android:crashlytics:2.9.1"

不幸的是,系统仍会报告崩溃。任何想法,我做错了什么?

您需要禁用 Crashlytics 个应用 build.gradle。 Disable Crashlytics for Debug Builds

android {
    buildTypes {
        debug {
          // Disable fabric build ID generation for debug builds
          ext.enableCrashlytics = false
          ...  

Firebase Crashlytics documentation 说明一旦在应用程序会话中启用报告,就无法禁用。

默认情况下,Crashlytics 报告在名为 CrashlyticsInitProviderContentProvider 中启用,它在您的 Application 实例创建之前执行。 CrashlyticsInitProvider 根据 meta-data 值 firebase_crashlytics_collection_enabled 启用或禁用报告,默认情况下为 true。

如果您想禁用报告,清单 meta-data 必须存在并设置为 false:

<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />

在应用程序初始化期间查看 logcat 消息:

CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful

如果消息存在,firebase_crashlytics_collection_enabled 为真。如果消息不存在,则您已成功设置 meta-data 以禁用崩溃报告。

如果 meta-data 缺失或设置为 true,则无法通过调用 Fabric.with(...).

在代码中禁用报告

在对另一个答案的评论中,您表示您尝试使用 meta-data 禁用报告但没有成功。检查拼写错误并确保声明正确放置在 <application> 元素中。在我的测试中,我能够使用 meta-data 禁用报告,然后在 运行 时启用。

我终于找到问题所在了。 Crashlytics 是从内容提供者初始化的,所以当您尝试从应用程序的 onCreate() 中禁用时已经太晚了。通过反编译代码,我发现您可以通过将元数据添加到清单中的 元素来禁用该初始化。

所以,我所做的是...我已将其添加到 app/src/debug/AndroidManifest。xml

<?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="<your app package>">

   <application>
           <meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />
   </application>

</manifest>

我还在应用程序模块 gradle 构建文件中禁用了 Crashlytics,方法是添加:

    debug {
        ext.enableCrashlytics = false
    }

令我惊讶的是,我不需要做 Fabric.with(...) 事情。以上就够了。

工作正常:没有报告。

正确答案已由 and already however it seems kinda tedious to change the meta-data value every time you are building an actual release APK thus here's a solution that uses so called manifestPlaceholder 发布,并根据 buildType.

自动将值更改为 truefalse

将以下内容添加到您的应用中 build.gradle

android {

    // ...

    buildTypes {
        debug {
            manifestPlaceholders = [enableCrashReporting:"false"]
        }
        release {
            manifestPlaceholders = [enableCrashReporting:"true"]
        }
    }

}

这给你的AndroidManifest.xml

<manifest ... >

    <application ...>

        // ...

        <meta-data android:name="firebase_crashlytics_collection_enabled" android:value="${enableCrashReporting}" />

    </application>

</manifest>

打开 AndroidManifest.xml 后,您可以通过单击 Merged Manifest 选项卡来验证当前值。你应该看到这样的东西:

从 android 文档中获取此信息 Customize your Firebase Crash Reports

启用选择性报告: 默认情况下,Firebase Crashlytics 会自动为您应用的所有用户收集崩溃报告。为了让用户更好地控制他们发送的数据,您可以改为启用选择性报告。

为此,您必须禁用自动收集并仅为选择加入的用户初始化 Crashlytics。

使用您的 AndroidManifest.xml 文件中的元数据标签关闭自动收集:

<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />

通过从您应用程序的一项活动初始化 Crashlytics,为选定用户启用收集:

Fabric.with(this, new Crashlytics());

如果您想完全禁用 Firebase 崩溃报告并且不必添加

com.crashlytics.sdk.android:crashlytics:2.9.1

依赖项,然后按照 的回答,同时将其添加到您的 AndroidManifest.xml:

<application ...>

    // ...

    <meta-data 
            android:name="firebase_crashlytics_collection_enabled" 
            android:value="${enableCrashReporting}" />
    <meta-data
            android:name="firebase_analytics_collection_deactivated"
            android:value="true"/>
</application>

我认为如果您切换到 firebase crashlytics 并删除 fabric crashlytics,也可以通过代码来完成: link to firebase doc

所以在您的应用程序的 onCreate 中 class :

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG);