Flutter異常資訊收集-Fabric Crashlytic
對於一個應用來說,異常崩潰資訊收集至關重要,接觸過flutter的開發者應該都知道,flutter使用dart開發大部分異常資訊都是導致頁面顯示不正確(頁面顯示錯誤棧資訊)或者空白,那flutter如何捕獲這些異常,捕獲異常後又如何收集上報監控系統,對於原生開發者來說,Fabric Crashlytic(崩潰收集系統)大家肯定不陌生,本文講述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上報異常資訊,那要怎麼做呢?其實方法很簡單,只要分小三步:
一 定義FlutterException(繼承Exception), 並且在應用內自定義Thread.UncaughtExceptionHandler,命名FlutterExceptionHandler,程式碼如下,注意init中的兩行程式碼,很關鍵哦

在uncaughtException中對應FlutterException的異常,直接return,這樣就不會往下傳遞到系統Exception處理器了,就可以保證應用不崩潰
二 在fabric呼叫init方法之前進行FlutterExceptionHandler init,這樣剛才提到的fabric裡的預設Exception處理器就是FlutterExceptionHandler了
三 在接收到dart端傳過來的errro資訊處呼叫Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), new FlutterException(exceptionStr))即可。
(另外,說明下如果在第二小步之後沒有其他地方呼叫Thread.setDefaultUncaughtExceptionHandler()的情況 這裡的Thread.getDefaultUncaughtExceptionHandler() 為fabric sdk裡的CrashlyticsUncaughtExceptionHandler )
在dart端製造個錯誤資訊,試驗下吧,這樣開啟fabric系統,就能看到異常資訊了