Fabric的Crashlytics与Firebase在DEBUG构建中无法禁用

44
我有一个应用程序,利用Firebase通过Fabric的Crashlytics。以下是在我的应用程序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"

不幸的是,崩溃仍然被报告。你有什么想法,我哪里做错了吗?


https://dev59.com/9loU5IYBdhLWcg3wg3AI#37396946 - vm345
1
谢谢,但我不使用firebase-crash,因为它已经被弃用了。你提出的答案使用了那个。我正在使用crashlytics,它只是与firebase控制台连接在一起。 - peshkira
7个回答

133

Bob Snyderniqueco已经发布了正确的答案,但是每次构建实际的发行版APK时更改元数据值似乎有点繁琐,因此这里提供一种解决方案,使用所谓的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 选项卡即可查看当前值。您应该会看到类似下面这样的内容:

Merged manifest meta-data value for crash reporting


1
它链接了其他解释推理的答案,并且还提供了一个干净的解决方案。 - dknchris
最佳且更通用的方法。谢谢 :) - Pioneer
是的,那正是我所做的。我已经为你的答案点赞了。不过,我将接受的答案保持原样,因为它指引我找到了正确的解决方案。 - peshkira
这是一个很好的解决方案! - Nabdreas

44
Firebase Crashlytics文档指出,一旦在应用程序会话中启用了报告功能,就无法禁用报告功能。默认情况下,在创建Application实例之前,名为CrashlyticsInitProviderContentProvider会启用Crashlytics报告功能。 CrashlyticsInitProvider根据元数据值firebase_crashlytics_collection_enabled启用或禁用报告功能,默认值为true。如果想要禁用报告功能,则必须存在并将清单元数据设置为false。
<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />

在应用程序初始化期间,在logcat中查找以下消息:

CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful
如果该消息存在,firebase_crashlytics_collection_enabled为true。如果该消息不存在,则已成功设置元数据以禁用崩溃报告。
如果元数据缺失或设置为true,则无法使用Fabric.with(...)调用在代码中禁用报告。
在对另一个答案的评论中,您指出尝试使用元数据禁用报告未成功。检查是否有拼写错误,并确保声明正确放置在<application>元素中。在我的测试中,我能够使用元数据禁用报告,然后在运行时启用。

谢谢,我会再试一次。 - peshkira
这是几个问题共同导致了这个问题。你的答案帮助我解决了它们,所以我接受了它。谢谢! - peshkira
3
我自己也有同样的问题,但这个解决方案似乎还不够。我已经添加了元数据,在日志中没有看到“CrashlyticsInitProvider初始化成功”的信息。我已经仔细检查过 Fabric.with(this, new Crashlytics()); 只在非调试构建时被调用,并且我使用的是 2.9.3 版本的 SDK,但我仍然收到崩溃报告。请帮忙解决 - 如果没有其他办法,我将尝试下面提到的基于Gradle的解决方案。 - Ovidiu
我尝试了这个,但不幸的是似乎不再起作用了。在DEBUG构建中,CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful 不再显示在日志中,但崩溃仍然会发送到我的控制台。firebase_core_version = '16.0.5'firebase_crashlytics_version = '2.9.6' - b4kancs
截至最新的Crashlytics版本,它会打印出I/CrashlyticsCore: Initializing Crashlytics 2.6.6.29 - Kirill Karmazin

9

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

所以,我做的是这样的...我将以下内容添加到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(...),以上代码已足够。
它正常工作:无错误报告。

谢谢,我会再试一次。 - peshkira
ext.enableCrashlytics = false 这行代码导致我的应用程序崩溃,并显示以下消息 - “此应用程序依赖于Crashlytics。请在https://fabric.io/sign_up注册以获取访问权限。” - Ajith M A
2
@AjithMemana 这个适用于旧版的Fabric Crashlytics。但问题是关于Firebase下的Fabric Crashlytics,需要查看被采纳的答案。 - David

5

如果您切换到 Firebase Crashlytics 并删除 Fabric Crashlytics,则也可以通过代码完成此操作:

Firebase 文档链接

因此,在应用程序类的 onCreate 方法中:

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

1
无法查看开发人员的崩溃情况。我该如何启用崩溃信息? - sejn

3

这段信息来自于Android文档:自定义Firebase崩溃报告

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

要启用选择性报告,您需要在AndroidManifest.xml文件中使用meta-data标签关闭自动收集,并仅为选择性报告的用户初始化Crashlytics。

请使用以下代码关闭自动收集:

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

通过从应用程序活动之一初始化Crashlytics来启用选定用户的收集:

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

2

您需要在app的build.gradle文件中禁用Crashlytics禁用调试版本的Crashlytics

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

再次感谢,但出于几个原因,我需要在运行时执行它。你有任何想法为什么“ .disabled”不起作用吗?在其他应用程序中,它可以完美地工作,而我没有连接Firebase。这似乎是Firebase的错误,不是吗? - peshkira
你需要在gradle中添加ext.enableCrashlytics = false,并在你的应用程序类中添加以下代码:CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder() .disabled(BuildConfig.DEBUG) .build(); Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build()); - vm345
很遗憾,不行。它仍然部署了在调试模式下产生的崩溃。我还尝试在清单中禁用它,使用firebase_crashlytics_collection_enabled。 - peshkira
@peshkira,你最终找到了适合你的解决方案吗? - Shobhit Puri
这适用于旧版的Fabric Crashlytics。问题是关于Firebase的Fabric Crashlytics,而不是它。 - David
显示剩余2条评论

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

标签,则可以通过以下方式实现:
com.crashlytics.sdk.android:crashlytics:2.9.1

如果您需要处理依赖关系,则可以按照@reVerse的答案操作,还需要将以下内容添加到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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接