无法为 DEBUG 版本禁用 Fabric 的 Crashlytics with Firebase

Posted

技术标签:

【中文标题】无法为 DEBUG 版本禁用 Fabric 的 Crashlytics with Firebase【英文标题】:Fabric's Crashlytics with Firebase can't be disabled for DEBUG builds 【发布时间】:2018-09-06 19:13:06 【问题描述】:

我有一个通过 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"

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

【问题讨论】:

***.com/a/37396946/7505436 谢谢,但我没有使用 firebase-crash,因为它现在已被弃用。您提出的答案使用了它。我正在使用 crashlytics,它只是与 firebase 控制台连接。 【参考方案1】:

Bob Snyder 和 niqueco 已经发布了正确答案,但是每次构建实际发布 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 选项卡来验证当前值。您应该会看到如下内容:

【讨论】:

它链接了解释推理的其他答案,它还提供了一个干净的解决方案。 最佳和更通用的方法。谢谢:) 是的,我就是这样做的。我赞成你的回答。但是,我将接受的答案保留原样,因为它为我指出了正确的解决方案。 这是一个不错的解决方案!【参考方案2】:

Firebase Crashlytics documentation 解释说,一旦在应用会话中启用报告,就无法禁用它。

默认情况下,在创建 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,则无法通过调用 Fabric.with(...) 在代码中禁用报告。

在对另一个答案的评论中,您表示您尝试使用元数据禁用报告但未成功。检查拼写错误并确保声明正确放置在 &lt;application&gt; 元素中。在我的测试中,我能够使用元数据禁用报告,然后在运行时启用。

【讨论】:

谢谢,我再试一次。 是几个问题共同导致了问题。您的回答帮助我解决了这些问题,所以我接受了。谢谢! 我自己也有同样的问题,这个解决方案似乎还不够。我已经添加了元数据,我在日志中没有“CrashlyticsInitProvider 初始化成功”,我已经四次检查Fabric.with(this, new Crashlytics()); 仅在非调试版本中调用,我有版本 2.9.3 的 SDK,我我仍然收到崩溃报告。请帮忙 - 如果没有别的事可做,我会尝试下面提到的基于 gradle 的解决方案。 我试过了,不幸的是,它似乎不再起作用了。 CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful 不再显示在 DEBUG 构建的日志中,但崩溃仍然发送到我的控制台。 firebase_core_version = '16.0.5' & firebase_crashlytics_version = '2.9.6' 从最新的 Crashlytics 开始,它会打印出 I/CrashlyticsCore: Initializing Crashlytics 2.6.6.29【参考方案3】:

我终于找到了问题所在。 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(...) 的事情。以上就够了。

一切正常:没有报告。

【讨论】:

谢谢,我再试一次。 ext.enableCrashlytics = false 此行正在使我的应用程序崩溃,并显示以下消息 - “此应用程序依赖于 Crashlytics。请通过 fabric.io/sign_up 注册访问,” @AjithMemana 这适用于旧的 Fabric Crashlytics。不是 Fabric 的 Crashlytics with Firebase,而是关于它的问题。为此,请查看已接受的答案【参考方案4】:

我认为如果您切换到 firebase crashlytics 并删除了 fabric crashlytics ,也可以从代码中做到这一点: link to firebase doc

所以在你的应用程序类的 onCreate 中:

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

【讨论】:

无法看到 dev 的崩溃。如何启用崩溃【参考方案5】:

从 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());

【讨论】:

【参考方案6】:

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

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

【讨论】:

再次感谢,但出于几个原因,我需要在运行时执行此操作。知道为什么.disabled 不起作用吗?它在我没有连接 Firebase 的其他应用程序中运行良好。这似乎是一个 firebase 错误,不是吗? 你需要在你的gradle里做ext.enableCrashlytics = false,在你的应用类里做CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder() .disabled(BuildConfig.DEBUG) .build(); Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build()); 很遗憾,没有。它仍然部署在调试模式下产生的崩溃。我还尝试使用 firebase_crashlytics_collection_enabled 在清单中禁用它 @peshkira 你终于找到适合你的解决方案了吗? @Shobhit Puri 是的。看看接受的答案【参考方案7】:

如果您想完全禁用 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>

【讨论】:

以上是关于无法为 DEBUG 版本禁用 Fabric 的 Crashlytics with Firebase的主要内容,如果未能解决你的问题,请参考以下文章

Fabric Debug Craslytic 报告:注册,缺少构建 ID,应用插件:io.fabric

Crashlytics 不显示崩溃

WCF:在 VS2010 中自动禁用 MEX 从 DEBUG 到 RELEASE 构建?

即使节点处于禁用状态,Fabric 集群中节点上的 RemoveNodeStateAsync() 也会失败。

Fabric.js 对象在 DOM 加载时从 JSON 呈现时无法更改填充颜色

为啥debug编译可以通过,release就无法解析外部符号