Flutter Crashlytics日志捕获到异常

Alf*_*gle 5 firebase crashlytics flutter

寻找一些关于如何使用flutter的firebase_crashlytics软件包记录捕获的异常的说明。

如果我理解正确(并且从运行一些示例代码开始),Crashlytics.instance.log('text');只会将日志添加到下一个崩溃报告中,而不是发送非致命性的问题本身。

我正在寻找Crashlytics.logException(e)与Android 等价的功能

try {
  throwException();
} catch (e) {
  Crashlytics.logExcpetion(e);
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以记录捕获的异常,使它们在Crashlytics仪表板中显示为非致命问题。

flutter的firebase_crashlytics包当前是否可以实现?

现在是否正在呼吁Crashlytics.instance.recordError('text', StackTrace.current)实现这一目标?

非常感谢!

TWL*_*TWL 6

简短的回答,是的。

Crashlytics.instance.recordError() 相当于 Crashlytics.logException()

如果您深入研究 Flutter firebase_crashlytics源代码,您实际上可以看到涉及哪些 Android API。

Flutter 的recordError()调用了 Android 库中的Crashlytics#onError方法。

并跟踪 Crashlytics#onError,你会看到它转到 Crashlytics.logException(exception);

附加说明,您还会注意到为什么Crashlytics.instance.log() “只会将日志添加到下一次崩溃报告中”。这些日志被添加到 a 中ListQueue<String> _logs,然后打包到下一次调用中recordError()

Flutter调用 Crashlytics.logException() 的片段:

_recordError(...) {
     ...
     final String result = await channel
          .invokeMethod<String>('Crashlytics#onError', <String, dynamic>{
        'exception': "${exception.toString()}",
        'context': '$context',
        'information': _information,
        'stackTraceElements': stackTraceElements,
        'logs': _logs.toList(),
        'keys': _prepareKeys(),
      });
}
Run Code Online (Sandbox Code Playgroud)

以及Crashlytics.logException() 的一些参考说明

为了减少用户的网络流量,Crashlytics 将记录的异常一起批处理并在应用程序下次启动时发送它们。

对于任何单个应用程序会话,仅存储最近记录的 8 个异常。


小智 5

要添加到已接受的答案中,Crashlytics.instance.recordError()新方法现已弃用FirebaseCrashlytics.instance.recordError(exception, stack)

额外提示: 我遇到了这个问题,所有记录的异常都分组在 Crashlytics 仪表板中的同一问题下。这些可能是相同或不同代码组件的不同崩溃。因此,我必须手动检查每个崩溃实例进行验证。

在此输入图像描述

根据我自己的测试,我发现分组是基于您传递到上面方法的堆栈跟踪中的最顶层行。幸运的是,Dart 有一种简单的方法可以使用StackTrace.current.

因此,要正确对问题进行分组:获取异常发生时的当前堆栈跟踪并将其传递到FirebaseCrashlytics.instance.recordError(exception, stack).

希望这对那里的人有帮助,我在互联网上到处寻找类似的问题,但找不到任何问题。