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

Posted

技术标签:

【中文标题】如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪【英文标题】:How to get better RxJava stacktraces with correct Crashlytics error grouping 【发布时间】:2019-08-26 14:09:51 【问题描述】:

我的目标是:

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

当前设置:

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

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

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

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

【问题讨论】:

看看这篇文章:rongi.github.io/kotlin-blog/rxjava/2017/09/25/… 这可能会否定 RxTracer 库的要求。 【参考方案1】:

就像我在another answer 中所说的那样,Crashlytics 正在按创建根本原因异常的方法和行对问题进行分组。

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

Crashlytics.logException(CompositeException(throwable, RuntimeException()))

以上将按您放置该 sn-p 的位置对 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 异常的根本原因的位置。

【讨论】:

以上是关于如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章

使用Crashlytics错误日志修复崩溃

Crashlytics,仪表板中受影响的用户数量错误

如何将 OkHttp 日志记录到 Crashlytics

如何验证 dSYM 是不是已上传到 Crashlytics

如何在 Swift 中使用 Crashlytics 登录?

如何更新 Fabric 和 Crashlytics?