如何使用正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪

dev*_*vha 5 android firebase crashlytics rx-java rx-java2

我的目标是:

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

当前设置:

  • 将错误侦听器添加到 rxjavasubscribe()并可以抛出
  • 要获得更好的堆栈跟踪,请使用RxTracer lib
  • 使用可抛出到 Firebase Crashlytics 的日志 Crashlytics.logException(t)

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

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

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

are*_*lek 0

正如我在另一个答案中所说,Crashlytics 按创建根本原因异常的方法和行对问题进行分组。

CompositeException上面链接的博客文章中提到的是一个很好的工具,可以实现两件事:让异常成为根本原因,同时保留原始异常的堆栈跟踪。

Crashlytics.logException(CompositeException(throwable, RuntimeException()))
Run Code Online (Sandbox Code Playgroud)

上面将按放置该代码片段的位置对 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())))
}
Run Code Online (Sandbox Code Playgroud)

它可以这样使用:

observable
    .doOnError { logNonFatal("Someone stuck in the thermosiphon", it) }
    .subscribe()
Run Code Online (Sandbox Code Playgroud)

您将获得按调用行(logNonFatal而不是it创建异常根本原因的行)分组的报告。