目录
一、Flutter 热更新概述
Flutter 热更新(Hot Update)允许开发者在不通过应用商店审核的情况下,动态更新应用代码或资源。由于 Flutter 的 AOT(Ahead-of-Time)编译特性,官方并未直接支持 Dart 代码的热更新,但社区和第三方团队提供了多种动态化方案。以下是主流方案的对比与实现细节。
二、主流热更新方案对比
1. Fair(58同城)
-
类型:JavaScript 动态化方案
-
原理:在 Flutter 中嵌入 JavaScript 层,将 Dart 代码转换为 JS 实现动态化。
-
特点:
- 支持动态加载 JSON 或二进制格式的热更新包。
- Debug 阶段使用
.fair.json
(易读),Release 阶段使用.fair.bin
(高性能)。 - 性能略低于原生 Flutter,但动态化能力强。
-
适用场景:需高频更新的业务页面(如活动页)。
-
官网 :Fair 官方文档
集成步骤:
-
开发 Dart 代码。
-
运行命令生成热更新包:
bash
arduinoflutter pub run build_runner build
-
上传生成的
build/fair
目录文件至服务器。 -
客户端通过
FairWidget
加载热更新包。
示例:
2. OTA Update
-
类型:全量 APK/IPA 更新
-
原理:直接下载新版安装包,需用户手动安装。
-
特点:
- 无需应用商店审核,但体验较差。
- 适用于紧急修复或大规模更新。
-
插件地址 :ota_update
代码示例:
dart
rust
await OtaUpdate().execute(
'https://example.com/app.apk',
destinationFilename: 'app_update.apk',
);
3. Tinker(腾讯)
-
类型:Android 原生热修复
-
原理 :修改 Dex 层实现原生代码热更新,不支持 Dart 代码。
-
适用场景:
- 修复 Android 原生代码问题。
- 需结合 Fair 等方案实现 Flutter 层动态化。
-
限制:仅支持 Android,无法覆盖 Flutter UI 层。
-
GitHub :Tinker
4. MXFlutter
-
类型:JavaScript 动态化方案
-
原理:将 JavaScript 代码转译为 Flutter 代码。
-
特点:
- 完全动态化,但性能较差。
- 维护成本高,适合高动态需求场景。
-
插件地址 :MXFlutter
5. Shiply(腾讯)
-
类型:自研虚拟机指令方案
-
原理:通过高性能虚拟机指令实现动态化,接近原生性能。
-
特点:
- 支持函数级、页面级、应用级动态化。
- 独家授权,年费 15 万元起。
-
官网 :Shiply
6. Shorebird(Flutter 团队)
-
类型:Dart 代码差分更新
-
原理:推送增量补丁,无需重新安装应用。
-
特点:
- 由 Flutter 团队维护,稳定性较高。
- 免费版限制 1,000 活跃用户/月,付费计划约 $50/月。
-
官网 :Shorebird
使用建议:
- 优先修复紧急 Bug,复杂功能仍需应用商店发布。
- 适合中小规模应用。
三、方案选型建议
方案 | 动态化能力 | 性能 | 成本 | 适用场景 |
---|---|---|---|---|
Fair | 高 | 中等 | 免费 | 高频更新页面 |
OTA Update | 低 | 高 | 免费 | 全量包紧急更新 |
Tinker | 低 | 高 | 免费 | Android 原生修复 |
MXFlutter | 高 | 低 | 免费 | 高动态需求 |
Shiply | 极高 | 接近原生 | 年费 15w+ | 企业级高要求动态化 |
Shorebird | 中 | 高 | 付费可选 | 中小规模应用快速修复 |
四、注意事项
- 合规性:热更新可能违反应用商店政策(如 Apple App Store),需谨慎使用。
- 性能权衡:动态化方案通常牺牲部分性能,建议仅对非核心页面使用。
- 测试覆盖:热更新包需充分测试,避免引发线上问题。