前言
最近浏览 Catcher、BugSnag、Rollbar 三个 Flutter 异样监控开源框架,文章链接如下:
Flutter 异样监控 – 壹 | 从 Zone 说起
Flutter 异样监控 – 贰 | 框架 Catcher 原理剖析
Flutter 异样监控 – 叁 | 从 bugsnag 源码学习如何追溯异样产生门路
Flutter 异样监控 – 肆 | Rollbar 源码赏析
这篇文章将从实现性能,优缺点,设计思维等方面做个总结,不便开发中技术选型。
需要列表
列举下认为比拟重点需要, 并不示意框架所有需要只有这些。
性能比照
所有上述需要次要体现在异样产生到发送过程中,大抵包含如下几个方面
Catcher | Bugsnag | Rollbar | |
---|---|---|---|
自定义 UI 显示异样 | 是(4 种报告模式) | 不反对 | 不反对 |
异样解决线程 | main isolate | 对端决定 | 子 isolate |
自定义包装过程 | 局部反对 | 不反对 | 反对 |
异样存储 | 不反对 | 对端存储 | Dart 侧存储 |
自定义上报处理程序 | 6 种 | 1 种(自研) | 1 种(自研) |
异样门路生成追溯 | 不反对 | 主动 + 手动 | 手动 |
是否纯 Dart 实现 | Dart | 对端 +Dart | Dart |
对端异样解决 | 不反对 | 反对 | 局部反对 |
是否有自研后盾 | 无 | 有 | 有 |
反对平台 | 全平台 | android,ios | android,ios |
框架的好与坏
如果问哪个最牛逼,我只能说:“没有不好的框架,只有乱用的人”。谁又不是个(某人心中的)宝宝呢?不同场景下谁都是本人的王者。
正确食用形式:
利用场景 | |
---|---|
Catcher | 如果对异样 UI 显示和自定义上报要求很高,且反对全平台,能够选 Catcher。 |
Bugsnag | 如果对端各平台 SDK 有深耕和技术积攒,能够参考 Bugsnag 来对立 Dart 端接口设计和主动埋点。 |
Rollbar | 如果偏重性能可插拔,对 UI 性能要求高,重度 Dart 用户且将来须要反对全平台,能够选 Rollbar。 |
论变与不变
设计模式中最重要的准则是开闭准则,23 种设计模式都是以开闭准则为外围。
开闭准则:“对扩大凋谢,对批改敞开。”,其中要害是辨认需要中的变与不变,封装变动隔离不变。
用 Rollbar 框架举例:
拿复用代码来说,变动的是多平台及多平台中不同的网络和存储实现,不变的是各平台都须要实现这套异样网络上报和存储逻辑。隔离不变,就是将网络和存储放在 Dart 侧,封装变动,将不同平台捕捉异样形式封装起来放到各自对应平台目录实现,这样就达到了复用代码目标。
这块能够看下 Flutter 异样监控 – 肆 | Rollbar 源码赏析 中的代码复用剖析,这里就不赘述了。
拿线程管制来说,变动的是在哪个线程,不变的是在线程中做的事件。Rollbar 中形象 Notifier 来对线程管制,隔离不变,从 Config 中获取 Wrangler,Sender,Telemetry 来对异样事件进行操作,先存储再包装最初发送,这些是异样解决的规范流程,封装变动,将线程切换封装在 Notifier 中。
Flutter 异样谁来上报
这三个开源我的项目,总结下来分两个流派:
- 自力派纯 Dart 实现,啥都是本人干,比方 Catcher 和 Rollbar
- 借力派,Flutter 侧负责收集 Flutter 异样,收集好解析好,给对端 SDK 负责上报,典型代表有 bugsnag 和 Sentry。
有人会说,管它白猫黑猫抓到老鼠就是好猫,只有能上报后盾看到后果不就 OK 了,管那么多干嘛,领导又不在乎这个。答复 Flutter 异样谁上报的本质是答复上面三个问题:
Flutter 与宿主的关系
你认为 Flutter 是掌控全局(ios android ,window,web…)的大佬还是追随其余平台的小弟?
从创立一个新的 Flutter 我的项目伊始 Flutter 官网就给出了答案,flutter create 命令完结,可看到 ios 和 android。。。目录,这些目录了解成差别目录,示意同一个性能对应不同平台的实现是什么,而后将实现填充在其中。
没错 Flutter 是掌控全局的人,他定义了一套对立的 Dart 侧接口供各平台差别实现,各差别目录作用是为解决差异化性能而非因宿主已有现成性能不便桥接用。
显然,按 Flutter 是大佬的思路,站在多平台对立的上帝视角来看,Flutter 异样范畴是包含其余平台异样的,比方其余平台的 OOM 等而非单纯思考 Dart 侧异样。
代码复用问题
用一个场景来阐明问题:如果依照不同平台维度建设我的项目,雷同我的项目则对应不同平台,如果依照 Flutter 来建设我的项目就是一个。
那么问题来了,是在安卓端和 ios 端别离建设一套数据存储异样呢,还是将不同平台异样收拢到 Flutter 平台来对立治理和上报?
显然思考到代码复用和人力老本,大可将其余平台异样抛都给 Flutter 侧来解决和上报,存储和上报都可复用,后盾也一套代码。
迁徙老本
很多开源库喜爱将 flutter 作为小弟角色,异样都给到对端,这样导致的问题也很显著,安卓和 ios 两个后盾异样零碎都会呈现 flutter 异样数据,默认存储两份上报两次,比方 Bugsnag,这时必定有人会说 Bugsnag 垃圾,强依赖对端,通用性不行,复用性不行。
但咱们须要看到更深层次起因:迁徙老本。
软件开发原本就是一个迭代过程,是先有安卓和 ios 再有 Flutter,人家曾经在各自平台有稳固的 crash-sdk 了,颠覆不必从新弄一套的行为太过激进,势必存在原来上报零碎的重构和迁徙,稳定性先不管,平白就减少了很多开发和测试的人力老本,不划算,间接桥接到原来性能岂不更好。
如图,人家就是每个平台都曾经有 SDK 了,而且 star 上 bugsnag-android 比 bugsnag-flutter 多得多,这叫先来后到,稳。
一种异样框架设计思路
依赖反转是不错的思路,子平台将异样收集传递给 Flutter 对立治理和上报。治理和上报原本就是各端通用能力,没必要节约人力各端反复实现,异样的状况每个平台接口都不一样,这种差异化的 api 就应该由各个平台来实现,刚好符合 Flutter 中目录分治理念。
有点像代码设计的思路,如果是通用的代码须要提取解决作为公共应用,如果有差别局部就应该分到各个子类中取实现。lib 中负责是各个平台公共局部,存在差别的是各个平台捕捉异样的 api 形式。
读源码在读什么
看需要,以后整个框架实现了哪些性能,跟本人想到的需要实现形式上有什么不同。
其次就是看有余,看有余能够对框架了解更深。如 Catcher 的局限性是它不反对异样的本地序列化断网了就发送不了,而且没本人后盾,仅仅侧重于 Adapter 角色;Bugsnag 又太依赖对端,反对异样序列化断网仍可发送,但不是 Flutter 自身实现而是对端能力,Bugsnag 的扩展性绝对于 Catcher 来说就差很多,包含多平台的适配上来说比不上 Catcher,但它有本人后盾有盈利能力。
最初是看设计,如 Rollbar 中对类设计模块形象精准且柔美,繁多准则和开闭准则做得很好。Catcher 中对 UI 显示和处理程序的开闭也做得很好,有时候看大佬们的设计思维只会感觉”编程即艺术”。
如果感觉文章对你有帮忙,点赞、珍藏、关注、评论 ,一键四连反对,你的反对就是我创作最大的能源。
❤️ 欢送关注公众号: 码里特地有禅 原创技术文章第一工夫推送!❤️