Flutter热更新技术探索
来源 | OSCHINA 社区
作者 | 京东云开发者-京东科技 刘振中、周智
原文链接:https://my.oschina.net/u/4090830/blog/9092965
一,需求背景:
APP 发布到市场后,难免会遇到严重的 BUG 阻碍用户使用,因此有在不发布新版本 APP 的情况下使用热更新技术立即修复 BUG 需求。原生 APP(例如:Android & IOS)的热更新需求已经比较成熟,但 Flutter 技术栈目前还缺少类似的技术方案,因此 Flutter 研发团队,也需要类似的热更新技术。
二,Flutter 热更新技术方向分析:
经过分析目前可能有三种可行的方案:1)类似 RN 框架;2)页面动态组件框架;3)Dart 虚拟机定制方案;
方案名称 | 原理 | 优点 | 缺点 | 开源方案 |
---|---|---|---|---|
类似 RN 的方案 | 用 JS 以 Flutter 语法写 dart,然后用 JavaScript 把 XML DSL 转为 Flutter 的原子 widget 组件,然后再让 Flutter 来渲染 | 由于 ios 系统内置支持 js,ios 上完全可以实现更新 | 1) 由于跨语言执行,对于性能有影响;学习成本高 2) Android 端需要额外引入 JS 库 | 手 Q 的 MXFlutter,58 同城的 Fair |
页面动态组件方案 | 编译期时插桩 / 预埋好 DynamicWidget 到代码中,然后动态下发 Json 数据,通过协定好的语义匹配到 JSON 内的数据,动态替换 Widget 内容来实现更新 | 能支持 Android/iOS 两端的更新 | 1)UI 更新相对较容易,业务逻辑动态化较麻烦;2)语义解析器开发成本相对较大,且不易维护 3)需要一整套前后端服务和工具 | 天猫的 Tangram,淘宝的 DinamicX 等 |
Dart 虚拟机定制方案 | 通过分析 Dart 虚拟机的原理,修改 Flutter Engine 层 Java/C++ 代码实现热更新的目标; | 性能影响小,动态性很高,技术上可以替换所有 Flutter 页面(包括 UI,逻辑,资源文件) | 由于使用的是定制引擎,需要维护不同版本的 Flutter 引擎代码; | 未开源 |
三,预备知识
3.1 Flutter 编译模式
编译模式名称 | 特点 | 优点 | 缺点 |
---|---|---|---|
JIT | 即时编译,典型例子 V8,它可以即时编译运行 JS,只需要输入源代码字符串,就可以编译运行代码 | 可以动态下发和执行代码,不用管 CPU 架构,可以提供动态化内容 | 1, 大量字符串代码让 JIT 编译器花费时间和内存;2, 性能不好; |
AOT | 预先编译,典型例子 C/C++,通过 GCC 编译成二进制代码,然后安装取得权限后才可以加载执行 | 事先编译好的,加载和执行速度快 | 1, 编译时区分 CPU 架构;2, 生成的二进制代码包比较大;3, 二进制代码需要取得权限才可以执行,无法在 ios 系统上动态更新 |
Flutter 编译模式有:Debug,Release,Profile;
Flutter 编译模式 | 特点 |
---|---|
Debug | 对应 JIT 模式,支持设备和模拟器;打开了断言,支持快速开发,支持 HotReload;并未对包大小,执行速度做优化; |
Release | 对应 AOT 模式,支持真机,不支持模拟器;禁止了所有断言调试信息;对包大小,启动和执行速度进行了优化; |
Profile | 类似 Release 模式,保留了一些调试功能,帮助性能分析; |
四,热更新技术方案分析
4.1 业务代码分析
名称 | 注释 | 作用 | 注释 |
---|---|---|---|
kDartIsolateSnapshotData | Dart isolate 数据段 | 类信息,全局变量,函数指针等 | 允许动态下发 |
kDartIsolateSnapshotInstructions | Dart isolate 指令段 | 包含由 Dart isolate 执行的 AOT 代码 | IOS 不允许动态下发 |
kDartVmSnapshotData | vm isolate 数据段 | isolate 之间共享的 Dart 堆 (heap) 的初始状态 | 允许动态下发 |
kDartVmSnapshotInstructions | vm isolate 指令段 | 包含 VM 中所有 Dart isolate 之间共享的通用程序的 AOT 指令 | IOS 不允许动态下发 |
注释:isolate, snapshot, vm isolate 含义解释如下:
名称 | 含义 |
---|---|
isolate | Dart 是单线程,isolate 跟线程差不多,可以理解为 Dart 中的线程。isolate 与线程的区别:线程与线程之间是共享内存的,而 isolate 和 isolate 之间是内存不共享的。不存在锁竞争问题,两个 Isolate 完全是两条独立的执行线,且每个 Isolate 都有自己的事件循环,它们之间只能通过发送消息通信,所以它的资源开销低于线程。 |
snapshot | 将类信息、全局变量、函数指令直接以序列化的方式存在磁盘中,称为 Snapshot(快照)。 |
vm isolate | 同一个进程里可以有很多 isolate,但两个 isolate 的堆区是不能共享的,所以官方设计了 VM isolate,也就是 kDartVmSnapshot,用来多个 isolate 之间的交互。 |
4.2 业务代码的加载分析(运行时)
4.3 业务代码的编译生成(编译时)
4.4 实现热更新的方案探索
END
点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章