Flutter动态化方案

背景

随着业务功能越来越复杂,Flutter应用需要持续更新添加新功能,而且也会遇到线上bug需要及时修复,目前常见的升级方式采用整体更新升级,无论是安卓还是IOS,都需提交对应的应用市场更新,审核周期长也经常有遇到被拒的情况,即使上线了也无法达到全部用户升级,存在兼容问题,费时费力,而且用户对app动辄几十兆几百兆的应用更新是比较抗拒的。

面对这些问题,如果能实现app增量、无感知更新,实现功能同步。无论是对公司还是用户都是非常重要的需求,能实现app动态化更新还是很有必要的:

  • 可以减小发版功能包大小,只需要替换新增功能即可;
  • 随时实现功能升级,不存在应用市场长时间审核和拒绝上线问题。
  • 功能保持一致,类似网页一样,发版后用户同步更新,不存在旧版本兼容问题
  • 线上bug可以实时修复,提高用户体验

    方案

    动态化方案实现,一个需要考虑通用性,即ios、安卓等各个端实现保持一致,方便统一维护;还有、升级包不能太大,保留渲染性能,否则跟h5对比就没有优势。
    简单全量更新SO
    安卓中接入flutter通过动态库so方式,主要有flutter.so和app.so,后者包括了功能代码,可以直接更新替换app.so即可,IOS无法通过类似方式更新。
    DSL替换
    美团的MTFlutter团队flap项目采用的静态生产DSL方案,通过对Dart语言注解,保证平台一致性。实现了动态下发与解释的逻辑页面一体化的 Flutter 动态化方案。Flap 的出现让 Flutter 动态化和包大小这两个短板得到了一定程度的弥补,促进了 Flutter 生态的发展。
    基于JS实现
    MXFlutter 是一套基于 JavaScript 的 Flutter 框架,可以用极其类似 Dart 的开发方式,通过编写 JavaScript 代码,来开发 Flutter 应用,或者使用 mxjsbuilder 编译器,把现有Flutter 工程编译为JS,运行在 mxflutter 之上。
    其他开源框架
    Fair是为Flutter设计的动态化框架,通过Fair Compiler工具对原生Dart源文件的自动转化,使项目获得动态更新Widget Tree和State的能力。方式类似于React Native。Fair提供了标准的Widget,它可以被用作一个新的动态页面或作为现有Flutter页面的一部分,诸如运营位的排版/样式修改,整页面替换,局部替换等都可以使用。