在运行时禁用/启用 Firebase Crashlytics

Posted

技术标签:

【中文标题】在运行时禁用/启用 Firebase Crashlytics【英文标题】:Disable/Enable Firebase Crashlytics during runtime 【发布时间】:2018-09-02 10:26:45 【问题描述】:

随着 Google 发出一波波关于需要让用户选择加入崩溃报告的警告 (source),我正在尝试为 Firebase Crashlytics 构建一个选择加入对话框。

为了能够做到这一点,我需要知道当前是否启用了 Crashlytics(以决定是否显示对话框)。似乎CrashlyticsCore.disabled 负责跟踪这个,但我还没有找到任何访问该值的方法,因为它是包私有的并且没有访问器。我如何在运行时知道 Firebase Crashlytics 是否已启用?

我需要做的第二件事是默认禁用崩溃报告,并在用户同意选择加入时启用它。我如何怀疑能够做到这一点:

androidManifest:

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

活动:

boolean userAgrees = true;
CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(!userAgrees).build();
Fabric.with(this,  new Crashlytics.Builder().core(core).build());

throw new RuntimeException("why doesn't this show up in Firebase Crashlytics?");

为什么我的 RuntimeException 没有出现在 Firebase Crashlytics 中?

附:删除这些尝试以创建选择加入对话框时,Crashlytics 工作正常。

【问题讨论】:

你正在使用crashlytics:2.9.1 构建吗?当我使用该版本时,您的代码对我有用。另外,在您的测试过程中,请注意直到下次应用重新启动时才会上传崩溃。 是的,我正在使用2.9.1。您能在 Firebase 或 Fabric 环境中看到崩溃报告吗?也许这是一个线程问题,因为我确实在 Activity 的onCreate 中抛出了RuntimeException,所以也许我正在崩溃我的应用程序,而 crashlytics 仍在另一个线程上上传之前的崩溃?我以为它是通过 Play 服务上传的,所以从没想过下一次应用重启。我会做更多的测试。 我在 Firebase 控制台中看到了崩溃。 【参考方案1】:

似乎切换 Crashlytics 只会在您的应用重启后生效。 Fabric 是一个单例,所有对其Fabric.with 方法的调用在初始化后都将被忽略。 源码如下。

public static Fabric with(Context context, Kit... kits) 
    if (singleton == null) 
        Class var2 = Fabric.class;
        synchronized(Fabric.class) 
            if (singleton == null) 
                setFabric((new Fabric.Builder(context)).kits(kits).build());
            
        
    

    return singleton;

解决此问题的一种方法是使用SharedPreferences 或其他持久存储方法自己跟踪值并相应地更新您的 UI。

【讨论】:

我知道如何自己保存一个布尔值,但我不喜欢这样做,因为它的代码很混乱,如果我的布尔值由于错误而与 sdk 不同步,那你就违法了。跨度>

以上是关于在运行时禁用/启用 Firebase Crashlytics的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 应用程序运行时启用/禁用 Crashlytics

Firebase:在验证时禁用帐户或在启用后发送验证

启用或禁用通知颤动

如何在 Flutter 中启用/禁用 Firebase Crashlytics

在运行时启用/禁用 SwaggerUI

在运行时启用和禁用 gprof?