Flutter上的數(shù)據(jù)監(jiān)控深入理解
前言
最近看公司Flutter項目的時候,發(fā)現(xiàn)想要分析數(shù)據(jù)非常的困難,不是數(shù)據(jù)缺失就是數(shù)據(jù)異常,作為一個成熟的企業(yè)來說這是非常危險的,缺少了數(shù)據(jù)就像船只在海上航行的時候沒有了方向,將會變得無所適從,所以這周花了點時間去優(yōu)化。
我們要關注什么數(shù)據(jù)
對于Flutter這樣的組件來說,我們需要關注的數(shù)據(jù)無非是兩項:
- 性能數(shù)據(jù)
- 異常數(shù)據(jù)
這兩項數(shù)據(jù)是我們監(jiān)控整個Flutter應用是否優(yōu)秀的最基礎也是最重要的指標。性能數(shù)據(jù)能夠幫我們分析出Flutter對比Native,RN,Weex等框架是否有優(yōu)勢,而異常數(shù)據(jù)則是反應了項目的健康程度,很多時候在項目開發(fā)和測試的過程中問題沒有暴露,而是在線上才會有問題,如果沒有異常監(jiān)控,應用就很難具備從錯誤中快速恢復的能力。
性能數(shù)據(jù)
對于性能數(shù)據(jù),我們可以拆分成以下兩個點:
- 渲染時長
- 頁面幀率
對于頁面幀率,目前我還沒有什么仔細思考過,這一塊的內容我會放在之后的文章中介紹。
對于渲染時長,我們可以通過Flutter給出的系統(tǒng)回調在監(jiān)控頁面第一幀的渲染時間。Android為以下方法:
getFlutterView().addFirstFrameListener(new FlutterView.FirstFrameListener() {
@Override
public void onFirstFrame() {
//第一幀渲染回調
}
});
iOS也差不多,具體大家可以參考網(wǎng)上的例子。
異常數(shù)據(jù)
對于異常數(shù)據(jù),我們可以拆分成以下幾個點:
- 頁面的打開次數(shù)
- 頁面發(fā)生異常的次數(shù)
- Framework的異常次數(shù)
- crash次數(shù)
統(tǒng)計頁面的打開次數(shù)是為了讓我們更好的觀測整個大盤的數(shù)據(jù),并且以它作為分母,得出我們整個Flutter項目的渲染成功率,這是很重要的一個指標。
但是我們想一想,在Flutter中使用navigator打開一個頁面,如果我們不做任何處理的話,是無法感知到一個Flutter頁面被打開了的,所以我們需要通過注冊nevigator的observer去監(jiān)聽頁面的打開與關閉:
Widget build(BuildContext context) {
return new MaterialApp(
navigatorObservers: [new MyNavigatorObserver()],
home: new Scaffold(
body: new MyPage(),
),
);
}
在MyNavigatorObserver中通過didPush方法去上報頁面打開的埋點。
有了頁面的打開數(shù)據(jù)之后,我們接下去需要統(tǒng)計的是異常的發(fā)生次數(shù),而在Flutter中異??梢源笾路譃槿悾?/p>
- Dart異常
- Framework異常
- crash
對于Dart異常,我們可以通過全局的onError函數(shù)去捕獲:
runZoned<Future<Null>>(() async {
runApp(new MyApp());
}, onError-: (error, stackTrace) async {
//監(jiān)聽DartError
});
但是這里的回調是只要有Dart層的error就會觸發(fā),這樣就帶來一個問題:許多不影響用戶體驗,無關緊要的error都會被我們統(tǒng)計到,從而影響我們數(shù)據(jù)的準確性。針對于上面這個問題,我的想法是既然要統(tǒng)計的是影響用戶的error,那我們可以借助Flutter本身的特性,我們知道Flutter在build期間發(fā)生了異常會展示一個紅屏的widget,這個widget是ErrorWidget,我們只需要hook這個widget的生成,在該widget展示的時候上報我們需要的埋點就可以了:
ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) {
//統(tǒng)計Dart error
return ErrorWidget(flutterErrorDetails.exception);
};
甚至我們還可以在這里重寫這個ErrorWidget,去展示我們自定義的錯誤頁。
說完了Dart異常,我們接著去處理Framework異常。這個異常比較特殊,應該是Android獨有的,因為在Android中我們需要加載動態(tài)庫去完成Flutter的初始化,所以這里我們可以捕獲動態(tài)庫的加載,如果有異常發(fā)生或者加載失敗,則算作為Framework層異常。
最后一個則是運行時的crash,對于這部分異常,我們需要做的就是進行堆棧的捕獲,并且判斷是否是Flutter引起的crash,如果是則上報埋點。
總結
通過上面的幾個數(shù)據(jù)統(tǒng)計,我們可以計算出Flutter應用的以下幾個數(shù)據(jù):
- 頁面渲染時間
- 頁面幀率
- 頁面打開次數(shù)
- 頁面異常率
- 頁面崩潰率
有了以上的幾個數(shù)據(jù),我們就可以根據(jù)它們來進行業(yè)務上的優(yōu)化,做到百尺竿頭更進一步。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
Android通過HTTP協(xié)議實現(xiàn)上傳文件數(shù)據(jù)
這篇文章主要為大家詳細介紹了Android通過HTTP協(xié)議實現(xiàn)上傳文件數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android 超詳細講解fitsSystemWindows屬性的使用
fitsSystemWindows屬性可以讓view根據(jù)系統(tǒng)窗口來調整自己的布局;簡單點說就是我們在設置應用布局時是否考慮系統(tǒng)窗口布局,這里系統(tǒng)窗口包括系統(tǒng)狀態(tài)欄、導航欄、輸入法等,包括一些手機系統(tǒng)帶有的底部虛擬按鍵2022-03-03
Android編程之非調用系統(tǒng)界面實現(xiàn)發(fā)送彩信的方法(MMS)
這篇文章主要介紹了Android編程之非調用系統(tǒng)界面實現(xiàn)發(fā)送彩信的方法,涉及Android源碼中的mms的使用技巧,需要的朋友可以參考下2016-01-01
教你五分鐘實現(xiàn)Android超漂亮的刻度輪播控件實例教程
說到輪播圖,想必大家都不陌生,下面這篇文章主要給大家介紹了關于如何利用五分鐘快速實現(xiàn)一款超漂亮的Android刻度輪播控件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧2018-09-09

