這篇文章將為大家詳細(xì)講解有關(guān)怎么深入理解Flutter上的數(shù)據(jù)監(jiān)控,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

前言
最近看公司Flutter項(xiàng)目的時(shí)候,發(fā)現(xiàn)想要分析數(shù)據(jù)非常的困難,不是數(shù)據(jù)缺失就是數(shù)據(jù)異常,作為一個(gè)成熟的企業(yè)來(lái)說(shuō)這是非常危險(xiǎn)的,缺少了數(shù)據(jù)就像船只在海上航行的時(shí)候沒(méi)有了方向,將會(huì)變得無(wú)所適從,所以這周花了點(diǎn)時(shí)間去優(yōu)化。
我們要關(guān)注什么數(shù)據(jù)對(duì)于Flutter這樣的組件來(lái)說(shuō),我們需要關(guān)注的數(shù)據(jù)無(wú)非是兩項(xiàng):
性能數(shù)據(jù) 異常數(shù)據(jù)
這兩項(xiàng)數(shù)據(jù)是我們監(jiān)控整個(gè)Flutter應(yīng)用是否優(yōu)秀的最基礎(chǔ)也是最重要的指標(biāo)。性能數(shù)據(jù)能夠幫我們分析出Flutter對(duì)比Native,RN,Weex等框架是否有優(yōu)勢(shì),而異常數(shù)據(jù)則是反應(yīng)了項(xiàng)目的健康程度,很多時(shí)候在項(xiàng)目開(kāi)發(fā)和測(cè)試的過(guò)程中問(wèn)題沒(méi)有暴露,而是在線上才會(huì)有問(wèn)題,如果沒(méi)有異常監(jiān)控,應(yīng)用就很難具備從錯(cuò)誤中快速恢復(fù)的能力。
性能數(shù)據(jù)
對(duì)于性能數(shù)據(jù),我們可以拆分成以下兩個(gè)點(diǎn):
渲染時(shí)長(zhǎng) 頁(yè)面幀率
對(duì)于頁(yè)面幀率,目前我還沒(méi)有什么仔細(xì)思考過(guò),這一塊的內(nèi)容我會(huì)放在之后的文章中介紹。
對(duì)于渲染時(shí)長(zhǎng),我們可以通過(guò)Flutter給出的系統(tǒng)回調(diào)在監(jiān)控頁(yè)面第一幀的渲染時(shí)間。Android為以下方法:
getFlutterView().addFirstFrameListener(new FlutterView.FirstFrameListener() { @Override public void onFirstFrame() { //第一幀渲染回調(diào) }});
iOS也差不多,具體大家可以參考網(wǎng)上的例子。
異常數(shù)據(jù)
對(duì)于異常數(shù)據(jù),我們可以拆分成以下幾個(gè)點(diǎn):
頁(yè)面的打開(kāi)次數(shù) 頁(yè)面發(fā)生異常的次數(shù) Framework的異常次數(shù) crash次數(shù)
統(tǒng)計(jì)頁(yè)面的打開(kāi)次數(shù)是為了讓我們更好的觀測(cè)整個(gè)大盤的數(shù)據(jù),并且以它作為分母,得出我們整個(gè)Flutter項(xiàng)目的渲染成功率,這是很重要的一個(gè)指標(biāo)。
但是我們想一想,在Flutter中使用navigator打開(kāi)一個(gè)頁(yè)面,如果我們不做任何處理的話,是無(wú)法感知到一個(gè)Flutter頁(yè)面被打開(kāi)了的,所以我們需要通過(guò)注冊(cè)nevigator的observer去監(jiān)聽(tīng)頁(yè)面的打開(kāi)與關(guān)閉:
Widget build(BuildContext context) { return new MaterialApp( navigatorObservers: [new MyNavigatorObserver()], home: new Scaffold( body: new MyPage(), ), );}
在MyNavigatorObserver中通過(guò)didPush方法去上報(bào)頁(yè)面打開(kāi)的埋點(diǎn)。
有了頁(yè)面的打開(kāi)數(shù)據(jù)之后,我們接下去需要統(tǒng)計(jì)的是異常的發(fā)生次數(shù),而在Flutter中異常可以大致分為三類:
Dart異常 Framework異常 crash
對(duì)于Dart異常,我們可以通過(guò)全局的onError函數(shù)去捕獲:
runZoned<Future<Null>>(() async {runApp(new MyApp());}, onError-: (error, stackTrace) async { //監(jiān)聽(tīng)DartError});
但是這里的回調(diào)是只要有Dart層的error就會(huì)觸發(fā),這樣就帶來(lái)一個(gè)問(wèn)題:許多不影響用戶體驗(yàn),無(wú)關(guān)緊要的error都會(huì)被我們統(tǒng)計(jì)到,從而影響我們數(shù)據(jù)的準(zhǔn)確性。針對(duì)于上面這個(gè)問(wèn)題,我的想法是既然要統(tǒng)計(jì)的是影響用戶的error,那我們可以借助Flutter本身的特性,我們知道Flutter在build期間發(fā)生了異常會(huì)展示一個(gè)紅屏的widget,這個(gè)widget是ErrorWidget,我們只需要hook這個(gè)widget的生成,在該widget展示的時(shí)候上報(bào)我們需要的埋點(diǎn)就可以了:
ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) { //統(tǒng)計(jì)Dart error return ErrorWidget(flutterErrorDetails.exception);};
甚至我們還可以在這里重寫這個(gè)ErrorWidget,去展示我們自定義的錯(cuò)誤頁(yè)。
說(shuō)完了Dart異常,我們接著去處理Framework異常。這個(gè)異常比較特殊,應(yīng)該是Android獨(dú)有的,因?yàn)樵贏ndroid中我們需要加載動(dòng)態(tài)庫(kù)去完成Flutter的初始化,所以這里我們可以捕獲動(dòng)態(tài)庫(kù)的加載,如果有異常發(fā)生或者加載失敗,則算作為Framework層異常。
最后一個(gè)則是運(yùn)行時(shí)的crash,對(duì)于這部分異常,我們需要做的就是進(jìn)行堆棧的捕獲,并且判斷是否是Flutter引起的crash,如果是則上報(bào)埋點(diǎn)。
通過(guò)上面的幾個(gè)數(shù)據(jù)統(tǒng)計(jì),我們可以計(jì)算出Flutter應(yīng)用的以下幾個(gè)數(shù)據(jù):
頁(yè)面渲染時(shí)間 頁(yè)面幀率 頁(yè)面打開(kāi)次數(shù) 頁(yè)面異常率 頁(yè)面崩潰率
有了以上的幾個(gè)數(shù)據(jù),我們就可以根據(jù)它們來(lái)進(jìn)行業(yè)務(wù)上的優(yōu)化,做到百尺竿頭更進(jìn)一步。
關(guān)于怎么深入理解Flutter上的數(shù)據(jù)監(jiān)控就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
當(dāng)前題目:怎么深入理解Flutter上的數(shù)據(jù)監(jiān)控-創(chuàng)新互聯(lián)
地址分享:http://chinadenli.net/article44/cochee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站、網(wǎng)站維護(hù)、虛擬主機(jī)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容