34

浅谈Flutter上的数据监控

 4 years ago
source link: https://www.tuicool.com/articles/f6NNVfV
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近看公司Flutter项目的时候,发现想要分析数据非常的困难,不是数据缺失就是数据异常,作为一个成熟的企业来说这是非常危险的,缺少了数据就像船只在海上航行的时候没有了方向,将会变得无所适从,所以这周花了点时间去优化。

我们要关注什么数据

对于Flutter这样的组件来说,我们需要关注的数据无非是两项:

  • 性能数据
  • 异常数据

这两项数据是我们监控整个Flutter应用是否优秀的最基础也是最重要的指标。性能数据能够帮我们分析出Flutter对比Native,RN,Weex等框架是否有优势,而异常数据则是反应了项目的健康程度,很多时候在项目开发和测试的过程中问题没有暴露,而是在线上才会有问题,如果没有异常监控,应用就很难具备从错误中快速恢复的能力。

性能数据

对于性能数据,我们可以拆分成以下两个点:

  • 渲染时长
  • 页面帧率

对于页面帧率,目前我还没有什么仔细思考过,这一块的内容我会放在之后的文章中介绍。

对于渲染时长,我们可以通过Flutter给出的系统回调在监控页面第一帧的渲染时间。Android为以下方法:

getFlutterView().addFirstFrameListener(new FlutterView.FirstFrameListener() {
    @Override
    public void onFirstFrame() {
      //第一帧渲染回调
    }
});

iOS也差不多,具体大家可以参考网上的例子。

异常数据

对于异常数据,我们可以拆分成以下几个点:

  • 页面的打开次数
  • 页面发生异常的次数
  • Framework的异常次数
  • crash次数

统计页面的打开次数是为了让我们更好的观测整个大盘的数据,并且以它作为分母,得出我们整个Flutter项目的渲染成功率,这是很重要的一个指标。

但是我们想一想,在Flutter中使用navigator打开一个页面,如果我们不做任何处理的话,是无法感知到一个Flutter页面被打开了的,所以我们需要通过注册nevigator的observer去监听页面的打开与关闭:

Widget build(BuildContext context) {
  return new MaterialApp(
    navigatorObservers: [new MyNavigatorObserver()],
    home: new Scaffold(
      body: new MyPage(),
    ),
  );
}

在MyNavigatorObserver中通过didPush方法去上报页面打开的埋点。

有了页面的打开数据之后,我们接下去需要统计的是异常的发生次数,而在Flutter中异常可以大致分为三类:

  1. Dart异常
  2. Framework异常
  3. crash

对于Dart异常,我们可以通过全局的onError函数去捕获:

runZoned<Future<Null>>(() async {
runApp(new MyApp());
}, onError-: (error, stackTrace) async {
	//监听DartError
});

但是这里的回调是只要有Dart层的error就会触发,这样就带来一个问题: 许多不影响用户体验,无关紧要的error都会被我们统计到,从而影响我们数据的准确性 。针对于上面这个问题,我的想法是既然要统计的是 影响用户 的error,那我们可以借助Flutter本身的特性,我们知道Flutter在build期间发生了异常会展示一个红屏的widget,这个widget是ErrorWidget,我们只需要hook这个widget的生成,在该widget展示的时候上报我们需要的埋点就可以了:

ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) {
  //统计Dart error
  return ErrorWidget(flutterErrorDetails.exception);
};

甚至我们还可以在这里重写这个ErrorWidget,去展示我们自定义的错误页。

说完了Dart异常,我们接着去处理Framework异常。这个异常比较特殊,应该是Android独有的,因为在Android中我们需要加载动态库去完成Flutter的初始化,所以这里我们可以捕获动态库的加载,如果有异常发生或者加载失败,则算作为Framework层异常。

最后一个则是运行时的crash,对于这部分异常,我们需要做的就是进行堆栈的捕获,并且判断是否是Flutter引起的crash,如果是则上报埋点。

总结

通过上面的几个数据统计,我们可以计算出Flutter应用的以下几个数据:

  • 页面渲染时间
  • 页面帧率
  • 页面打开次数
  • 页面异常率
  • 页面崩溃率

有了以上的几个数据,我们就可以根据它们来进行业务上的优化,做到百尺竿头更进一步。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK