对于一个应用来说,异常崩溃信息收集至关重要,接触过flutter的开发者应该都知道,flutter使用dart开发大部分异常信息都是导致页面显示不正确(页面显示错误栈信息)或者空白,那flutter如何捕获这些异常,捕获异常后又如何收集上报监控系统,对于原生开发者来说,Fabric Crashlytics(崩溃收集系统)大家肯定不陌生,本文讲述Flutter如何使用fabric进行异常信息收集监控。主要分如下三步:
一 Flutter dart端捕获异常
使用FlutterError.onError 和 runZoned, 在main.dart的main()方法中添加如下代码:
二 通过channel把异常信息传到native:
上图代码中_reportError()是就是通过channel调用native方法,把error栈的信息传的native中,channel具体用法参考flutter platform channel详解,native端接收到error栈信息后如何上报fabric,请看第三步。
三 fabric收集异常信息
接入过fabric的开发者了解,fabric的接入及其简单,调用SDK的init及set deviceId一些基本信息就ok, 开发者并不需要主动去上传错误信息,fabric源码内部是通过实现Thread.UncaughtExceptionHandler接口,即自定义 Thread.UncaughtExceptionHandler来实现的,在uncaughtException方法中接收到错误信息并进行上报的, 之后把错误信息传递给默认的Exception处理器(注意这里所说的默认Exception处理器是在fabric源码初始化方法里通过Thread.getDefaultUncaughtExceptionHandler()获取的(并不一定是系统的哦)。
对于fabric收集大都是导致应用崩溃的错误日志,而对于flutter来说大部分异常信息只是页面上显示问题,并不会导致应用崩溃,我们只是想要向fabric上报异常信息,那要怎么做呢?其实方法很简单,只要分小三步:
1 、 定义FlutterException(继承Exception), 并且在应用内自定义Thread.UncaughtExceptionHandler,命名FlutterExceptionHandler,代码如下,注意init中的两行代码,很关键哦
在uncaughtException中对应FlutterException的异常,直接return,这样就不会往下传递到系统Exception处理器了,就可以保证应用不崩溃
2、 在fabric调用init方法之前进行FlutterExceptionHandler init,这样刚才提到的fabric里的默认Exception处理器就是FlutterExceptionHandler了
3、 在接收到dart端传过来的errro信息处调用Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), new FlutterException(exceptionStr))即可。
(另外,说明下如果在第二小步之后没有其他地方调用Thread.setDefaultUncaughtExceptionHandler()的情况 这里的第三小步中的Thread.getDefaultUncaughtExceptionHandler() 为fabric sdk里的CrashlyticsUncaughtExceptionHandler )
在dart端制造个错误信息,试验下吧,这样打开fabric系统,就能看到异常信息了