一、Shorebird 与 Flutter 热更新简介
Shorebird 是一个专为 Flutter 应用设计的热更新框架,旨在实现应用在不发布新版本的情况下修复 bug、优化性能。其核心机制是通过动态加载 Dart 的 patch 文件,实现代码的远程更新。然而,如何在不打扰用户的情况下完成崩溃修复,是其应用落地的核心挑战。
二、实现无感修复的关键问题
热更新包兼容性问题:不同 Flutter SDK 版本之间的 patch 文件可能存在不兼容,导致更新失败或崩溃。崩溃恢复机制设计:当热更新失败或 patch 文件异常时,如何保证应用能回退到稳定状态。更新时机选择:在用户使用高峰期更新可能导致卡顿或崩溃,需选择合适时机触发更新。网络请求失败降级策略:热更新依赖网络请求获取 patch 文件,网络异常时如何保证应用正常运行。
三、热更新包兼容性保障策略
为确保 patch 文件与当前运行环境兼容,Shorebird 提供了以下机制:
版本指纹校验:每个 patch 包含构建时的 SDK 版本、引擎 hash 等信息,客户端在加载前进行校验。增量更新机制:通过 diff 工具生成 patch 文件,减少更新体积并提高兼容性。本地缓存策略:缓存最近成功的 patch,用于降级恢复。
四、崩溃恢复机制设计
无感修复的核心在于崩溃发生后的自动恢复能力,以下是典型设计方案:
void tryApplyPatch() {
try {
ShorebirdEngine.applyPatch();
} catch (e) {
logError('Patch apply failed: $e');
rollbackToStable();
}
}
void rollbackToStable() {
ShorebirdEngine.revertToBaseline();
}
五、更新时机选择与用户行为感知
更新时机选择不当可能影响用户体验。推荐策略如下:
更新时机优点缺点冷启动时用户未操作,更新风险低可能延长启动时间空闲状态下不影响用户操作需要检测用户行为状态崩溃后重启修复后立即生效可能影响用户信心
六、网络请求失败时的降级策略
网络不可靠是热更新失败的常见原因。以下是推荐的降级策略:
本地缓存最新 patch 文件,失败时自动加载。重试机制:指数退避重试策略。后台静默更新:在网络恢复后自动尝试更新。
七、无感修复整体流程图
graph TD
A[App启动] --> B{是否需要更新?}
B -- 是 --> C[请求patch文件]
B -- 否 --> D[使用本地版本]
C --> E{请求成功?}
E -- 是 --> F[校验patch兼容性]
E -- 否 --> G[使用缓存patch]
F --> H{校验通过?}
H -- 是 --> I[应用patch]
H -- 否 --> J[回滚到稳定版本]
I --> K[热更新成功]
J --> L[崩溃恢复]