寻找一些关于如何使用flutter的firebase_crashlytics软件包记录捕获的异常的说明。
如果我正确理解了(并且从运行一些示例代码开始),Crashlytics.instance.log('text');
只会将日志添加到下一个崩溃报告中,而不会发送非致命性的问题本身。
我正在寻找与Android上的Crashlytics.logException(e)
等效的功能,例如
try {
throwException();
} catch (e) {
Crashlytics.logExcpetion(e);
}
它允许您记录捕获的异常,使它们在Crashlytics仪表板中显示为非致命问题。
当前可以通过flutter的firebase_crashlytics软件包实现吗?
现在是通过调用Crashlytics.instance.recordError('text', StackTrace.current)
来实现这一目标的方法吗?
非常感谢!
答案 0 :(得分:2)
答案很简单,是
Crashlytics.instance.recordError()
等效于Crashlytics.logExcpetion()
如果您深入研究Flutter firebase_crashlytics源代码,则实际上可以看到涉及到的Android API。
Flutter的recordError()调用Android库中的方法Crashlytics#onError。
并跟踪Crashlytics#onError,您会看到它进入了Crashlytics.logException(exception);
附加说明,您还会注意到为什么Crashlytics.instance.log()
“只会将日志添加到下一个崩溃报告中” 。这些日志添加到ListQueue<String> _logs
,然后打包到下一次调用recordError()
Flutter的invocation of Crashlytics.logExcpetion()的摘要:
_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(),
});
}
还有一些参考文献notes for Crashlytics.logExcpetion():
为减少用户的网络流量,Crashlytics记录了批次 异常一起发送,并在下次应用启动时将它们发送出去。
对于任何单个应用程序会话,仅记录最近的8个 异常被存储。
答案 1 :(得分:0)
为了添加到已接受的答案中,新方法 Crashlytics.instance.recordError()
现在已弃用 FirebaseCrashlytics.instance.recordError(exception, stack)
。
额外提示: 我遇到了这个问题,其中所有记录的异常都在 Crashlytics 仪表板中的同一问题下分组。这些可能是相同或不同代码组件的不同崩溃。因此,我不得不手动检查崩溃的每个实例以进行验证。
从我自己的测试中,我发现分组基于您传递给上述方法的堆栈跟踪中的最顶层行。幸运的是,Dart 有一种使用 StackTrace.current
获取当前堆栈跟踪的简单方法。
因此要正确地对问题进行分组:获取异常发生时的当前堆栈跟踪并将其传递到 FirebaseCrashlytics.instance.recordError(exception, stack)
。
希望这对那里的人有所帮助,我在互联网上到处寻找类似的问题,但找不到任何。