Crashlytics.logException 方法抛出非法状态异常。无法收集某些活动的非致命问题

Posted

技术标签:

【中文标题】Crashlytics.logException 方法抛出非法状态异常。无法收集某些活动的非致命问题【英文标题】:Crashlytics.logException method throwing illegal state exception. Not able to collect non-fatal issues for some activities 【发布时间】:2019-04-09 17:14:24 【问题描述】:

我的应用使用了上述 Firebase Crashlytics 功能,但我遇到了一个奇怪的问题。最近我在我的应用程序的 Playstore 崩溃中看到了一个异常(见附图)。 该位置对应的代码如下:

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my_sites)
        setSupportActionBar(findViewById(R.id.my_toolbar))

        init()
        try
            loadSitesSetAdapter()
         catch (e:NullPointerException)
            Crashlytics.logException(e) // this is line 55 as crash
            finish()
//            startActivity(Intent(this,MainActivity::class.java))
        

我的应用中的 Fabric 初始化如下:

在应用程序级别的 gradle 中我有:

buildTypes 
    release 
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    
    debug 
        // Disable fabric build ID generation for debug builds
        ext.enableCrashlytics = false
    

在主要活动中,我有以下内容:

val crashlyticsKit = Crashlytics.Builder()
                                    .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
                                    .build();

    // Initialize Fabric with the debug-disabled crashlytics.
    Fabric.with(this,crashlyticsKit)

最后但并非最不重要的一点是我在 gradle 文件中的依赖关系如下:

// Crashlytics
implementation('com.crashlytics.sdk.android:crashlytics:2.9.8@aar') 
    transitive = true;

我在这里有什么明显的遗漏吗?请帮忙

【问题讨论】:

【参考方案1】:

Fabric 必须先初始化,然后才能在应用中使用。您在哪里调用Crashlytics.logException(e),是在Fabric.with(this,crashlyticsKit) 行之前完成的吗?如果没有,则必须先初始化 Fabric,然后才能使用它的任何方法。

如果您要在多个活动/屏幕中调用 Fabric 方法,那么最好有一个可以初始化 Fabric 的 Application 子类。

请参阅此处的入门段落: https://docs.fabric.io/android/fabric/overview.html#manual-setup

【讨论】:

谢谢。我只在主要活动中这样做。我不知道每项活动都需要这样做。 是的,如果你想在多个活动中使用它,只需创建一个 Application 子类并在该类的 onCreate 方法中初始化它。 这是令人困惑的地方:我正在查看此页面:firebase.google.com/docs/crashlytics/… 在第 2 点上显示“在您的任何一项活动中” 如果您只希望它用于一项活动,那很好。但是对于多个屏幕,您应该将其放在 Application 子类中。如果没有,那么您只需为每个要使用它的 Activity 将它放在 onCreate 中。

以上是关于Crashlytics.logException 方法抛出非法状态异常。无法收集某些活动的非致命问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase (Crashlytics) 记录非致命(捕获)异常