如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪
Posted
技术标签:
【中文标题】如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪【英文标题】:How to get better RxJava stacktraces with correct Crashlytics error grouping 【发布时间】:2019-08-26 14:09:51 【问题描述】:我的目标是:
Log RxJava 链向 Firebase Crashlytics 处理错误 获取一些合理的堆栈跟踪(也指向我的代码) 正确完成 Firebase Crashlytics 错误分组(并非所有问题都归为一个)当前设置:
将错误侦听器添加到 rxjavasubscribe()
并获得 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 堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章