android - 如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪

标签 android firebase rx-java rx-java2 crashlytics

我的目标是:

  • 将 RxJava 链处理错误记录到 Firebase Crashlytics
  • 获取一些合理的堆栈跟踪(也指向我的代码)
  • 正确完成 Firebase Crashlytics 错误分组(并非所有问题都归为一个)

  • 当前设置:
  • rxjava 添加错误监听器subscribe()并获得可 throw
  • 要获得更好的堆栈跟踪,请使用 RxTracer
  • 使用 Crashlytics.logException(t) 将 throwable 记录到 Firebase Crashlytics

  • 此设置的问题是 Firebase Crashlytics 将几乎所有错误都归入 RxTracer TracingObserver.java – line 2 - com.halfhp.rxtracer.TracingObserver. 下。

    我找不到将自定义分组等添加到 Firebase Crashlytics 的任何方法

    你们如何向 Firebase Crashlytics 报告 RxJava 错误?

    最佳答案

    就像我在 another answer 中所说的那样, Crashlytics 按创建根本原因异常的方法和行对问题进行分组。CompositeException上面链接的博客文章中提到的是一个很好的工具,可以实现两件事:让您的异常成为根本原因,同时保留原始异常的堆栈跟踪。

    Crashlytics.logException(CompositeException(throwable, RuntimeException()))
    
    以上将按您放置该 fragment 的位置对 Crashlytics 问题进行分组,因为 RuntimeException将是记录异常的根本原因。
    像这样的函数可能会更有用:
    import androidx.annotation.Keep
    import com.crashlytics.android.Crashlytics
    import io.reactivex.exceptions.CompositeException
    
    class NonFatalException(message: String, cause: Throwable? = null) : RuntimeException(message, cause)
    
    class BreadcrumbException : RuntimeException() {
        override fun getStackTrace() = super.getStackTrace()
                .dropWhile { it.className == "com.example.NonFatalExceptionKt" }
                .toTypedArray()
    }
    
    @Keep
    fun logNonFatal(message: String, throwable: Throwable) {
        Crashlytics.logException(NonFatalException(message, CompositeException(throwable, BreadcrumbException())))
    }
    
    它可以这样使用:
    observable
        .doOnError { logNonFatal("Someone stuck in the thermosiphon", it) }
        .subscribe()
    
    您将获得按 logNonFatal 所在行分组的报告。被调用,而不是 it 的根本原因创建了异常。

    关于android - 如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57659583/

    相关文章:

    android - (异常资源 $NotFoundException))ListView.layoutChildren() 行 : 1596

    android - 防止 Android 上的 Unity 在启动画面上检测用户输入?

    javascript - Firestore 获取数据的时间太长,因此我无法显示它

    ios - 如何在 iOS 中使用 Firebase 修复此 Signal SIGABRT?

    firebase - 删除 Firestore 中数组的索引

    java - RxJava retryWhen 和 onError

    android - 如何使用 nexus 7 进行 mac os 开发

    android - Retrofit 请求完成后会发生什么?

    android - RealmRecylerAdapter 与 RxJava

    android - 如何在 Android 中使用正则表达式运行查询