對于一個應(yīng)用來說,異常崩潰信息收集至關(guān)重要,接觸過flutter的開發(fā)者應(yīng)該都知道,flutter使用dart開發(fā)大部分異常信息都是導(dǎo)致頁面顯示不正確(頁面顯示錯誤棧信息)或者空白,那flutter如何捕獲這些異常,捕獲異常后又如何收集上報監(jiān)控系統(tǒng),對于原生開發(fā)者來說,F(xiàn)abric Crashlytics(崩潰收集系統(tǒng))大家肯定不陌生,本文講述Flutter如何使用fabric進行異常信息收集監(jiān)控。主要分如下三步:
一 ?Flutter dart端捕獲異常
使用FlutterError.onError 和 runZoned, 在main.dart的main()方法中添加如下代碼:

二 通過channel把異常信息傳到native:
上圖代碼中_reportError()是就是通過channel調(diào)用native方法,把error棧的信息傳的native中,channel具體用法參考flutter platform channel詳解,native端接收到error棧信息后如何上報fabric,請看第三步。
三 fabric收集異常信息
接入過fabric的開發(fā)者了解,fabric的接入及其簡單,調(diào)用SDK的init及set deviceId一些基本信息就ok, 開發(fā)者并不需要主動去上傳錯誤信息,fabric源碼內(nèi)部是通過實現(xiàn)Thread.UncaughtExceptionHandler接口,即自定義?Thread.UncaughtExceptionHandler來實現(xiàn)的,在uncaughtException方法中接收到錯誤信息并進行上報的,?之后把錯誤信息傳遞給默認的Exception處理器(注意這里所說的默認Exception處理器是在fabric源碼初始化方法里通過Thread.getDefaultUncaughtExceptionHandler()獲取的(并不一定是系統(tǒng)的哦)。
對于fabric收集大都是導(dǎo)致應(yīng)用崩潰的錯誤日志,而對于flutter來說大部分異常信息只是頁面上顯示問題,并不會導(dǎo)致應(yīng)用崩潰,我們只是想要向fabric上報異常信息,那要怎么做呢?其實方法很簡單,只要分小三步:
1 、 定義FlutterException(繼承Exception), 并且在應(yīng)用內(nèi)自定義Thread.UncaughtExceptionHandler,命名FlutterExceptionHandler,代碼如下,注意init中的兩行代碼,很關(guān)鍵哦

在uncaughtException中對應(yīng)FlutterException的異常,直接return,這樣就不會往下傳遞到系統(tǒng)Exception處理器了,就可以保證應(yīng)用不崩潰
2、 在fabric調(diào)用init方法之前進行FlutterExceptionHandler init,這樣剛才提到的fabric里的默認Exception處理器就是FlutterExceptionHandler了
3、 在接收到dart端傳過來的errro信息處調(diào)用Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), new FlutterException(exceptionStr))即可。
(另外,說明下如果在第二小步之后沒有其他地方調(diào)用Thread.setDefaultUncaughtExceptionHandler()的情況 這里的第三小步中的Thread.getDefaultUncaughtExceptionHandler() 為fabric sdk里的CrashlyticsUncaughtExceptionHandler )
在dart端制造個錯誤信息,試驗下吧,這樣打開fabric系統(tǒng),就能看到異常信息了