首页/文章/flutter

Flutter 新版本发布实战:完整安装包与 Shorebird 热更新

2026-10-14
3466 字约 12 分钟
...

一、先判断该发完整包还是补丁

这次改动发布方式
Dart 文案、Flutter 页面布局、业务逻辑修复通常可以发布补丁
纯 Dart 依赖变化可以尝试补丁构建,仍需验证兼容性
Kotlin、Java、Swift、Objective-C 或原生构建配置变化发布完整包
插件的原生实现变化、新增原生插件、权限变化发布完整包
新增或修改打包图片、字体、应用图标等资源发布完整包
首次接入 Shorebird,用户还在使用普通 Flutter 包先发布并安装 Shorebird 基础包

判断依据是最终产物的变化。修改 pubspec.yaml 里的依赖,并不意味着一定能热更新;一个看起来只在 Dart 中调用的插件,可能也包含原生代码。Shorebird 会检查原生和资源差异,不应为了绕过检查直接使用 --allow-native-diffs 或 --allow-asset-diffs。更新范围与限制

二、理解基础版本与补丁编号

假设 pubspec.yaml 中已有:

version: 1.0.0+1

1.0.0 是对用户展示的版本名称,+1 是构建号。Android 对应 versionName 和 versionCode,iOS 对应 CFBundleShortVersionString 和 CFBundleVersion。发布新的完整包时,要设置合适的新版本和递增的构建号,例如 1.1.0+2。Android 版本配置、iOS 版本配置

热更新则在基础版本下增加补丁编号,例如:

基础版本 1.1.0+2
  ├─ 补丁 1:修正文案
  └─ 补丁 2:修复筛选逻辑

发布补丁时,保持目标基础版本的版本号不变,并明确指定 --release-version。补丁 2 的代码应包含仍需保留的补丁 1 修复,不能把补丁理解成会按顺序逐个执行的数据库迁移脚本。多个基础版本需要分别维护、构建和验证适用补丁;给 1.1.0+2 发布补丁,不会自动更新还停留在 1.0.0+1 的安装。创建补丁

三、首次接入只做一次

已经接入并发布过基础包的项目,可以跳过本节。

先按官方说明安装 CLI,再登录并初始化:

shorebird login
shorebird init --display-name "Example App"
shorebird doctor

init 会生成真实 app_id,写入 shorebird.yaml,并把该文件加入打包资源。保留生成的配置,日常发布不需要重复初始化,更不要随意执行 init --force 创建另一套应用标识。app_id 本身不是密码,可以提交配置;登录凭证、API token 和签名私钥应单独管理。初始化说明

本文示例应用通过 shorebird_code_push 自己检查和下载更新,因此配置了 auto_update: false,避免与默认自动更新流程重复运行。这不是所有项目都必须设置的选项:关闭默认更新后,应用代码必须负责调用更新 SDK。

四、完整包发布:构建只是其中一步

1. 整理待发布代码并运行检查

确认代码已保存,检查改动和依赖锁文件。通用检查可以使用:

flutter pub get --enforce-lockfile
dart format --output=none --set-exit-if-changed lib test
flutter analyze --fatal-infos
flutter test
git diff --check

项目已有统一检查脚本时,以项目脚本为准。格式命令报告失败时,先修复格式再重新检查。依赖镜像与锁文件来源不一致时,使用项目约定的包源,避免通过无关的依赖升级解决环境问题。

完整包发布还应记录代码提交、依赖锁文件、Flutter SDK 版本和构建参数。构建成功只说明产物生成成功,不能代替设备验收。

2. 增加版本号,确认签名

例如把 pubspec.yaml 改成:

version: 1.1.0+2

Android 要配置自己的正式 release 签名;不能把开发签名测试包直接当成正式交付。覆盖安装需保持同一应用标识,并满足签名兼容要求。签名不匹配时,不应通过卸载旧应用“解决”问题,因为这可能丢失本地数据。密钥文件和签名密码不要提交到仓库。Android 签名说明

iOS 需要相应的开发者账号、证书、描述文件及 Xcode 签名配置。未签名构建通过,不能证明 IPA 可以安装或提交商店。iOS 发布前提

3. 用 Shorebird 构建并注册基础包

先核对项目固定的 SDK 是否受支持:

shorebird flutter versions list
shorebird doctor

下面的 3.47.7 只是示例,应替换为项目实际固定并经核实受支持的版本。

Android 分发 APK:

shorebird release android --flutter-version 3.47.7 --artifact apk

Android 面向 Google Play 构建 AAB:

shorebird release android --flutter-version 3.47.7

iOS:

shorebird release ios --flutter-version 3.47.7

以上是按平台和分发方式选择的命令示例,不要针对同一平台、同一版本依次重复注册基础版本。需要 APK 或 AAB 时先确定交付方式,并以 CLI 输出的产物路径为准。

shorebird release 会构建应用并向 Shorebird 注册补丁基准;接下来仍需把安装包交给用户,或者提交对应应用商店。普通 flutter build 产物不能代替带 Shorebird 引擎的基础包。基础版本发布说明

4. 安装、验收、分发

先在测试设备上覆盖安装正式签名的候选包,确认启动、核心功能、登录态和本地数据正常。核对支持的 CPU 架构:仅 arm64 的包不能作为所有 Android 设备都能安装的证明。

APK 走自己的可信分发渠道;AAB 提交 Google Play;iOS 先经 TestFlight 或适用的测试方式验收,再提交 App Store。应用商店上传、审核和正式发布是后续步骤,不能仅凭 Shorebird 显示 release 成功就宣布已上架。

分发时交付注册基础版本所对应的产物,避免之后又用另一套工具或不同参数重建一份同版本包,导致用户安装包与补丁基准不一致。

五、日常补丁发布:保持基础版本号不变

以下假设用户已经安装 1.1.0+2 的 Shorebird 基础包,且改动只涉及可补丁化的代码。

1. 修改代码并检查

修复问题,运行项目检查,确认此次改动没有原生或资源变化。保持 version: 1.1.0+2,使用对应基础包的 Flutter 版本,并保持 flavor、入口文件及必要的构建参数一致。

2. 构建验证,再发布到目标通道

可先进行不上传的构建验证:

shorebird patch android --release-version 1.1.0+2 --dry-run

需要直接面向正式用户发布时:

shorebird patch android --release-version 1.1.0+2 --track stable

iOS 有自己的基础版本和补丁,需单独处理:

shorebird patch ios --release-version 1.1.0+2 --track stable

Android 成功不代表 iOS 同步成功。执行上传确认前,要核对 CLI 展示的应用、平台、目标版本和通道。发布 stable 后,匹配该基础版本和通道的用户设备就可能收到补丁。补丁命令与参数

3. 有预发布能力时,先 staging,再 stable

正式用户较多时,推荐先发布到 staging:

shorebird patch android --release-version 1.1.0+2 --track staging

然后用支持该通道的测试客户端或官方预览流程验证。只发布到 staging,不代表测试手机会自动切换通道。 如果应用在更新 SDK 调用中明确指定 UpdateTrack.stable,其应用内检查仍请求 stable;要先准备能请求 staging 的验证方式,不能把“没发现更新”当成补丁有问题。通道与设备订阅

验证完成后,把已经测过的补丁移动到 stable。先查看控制台记录,或者列出目标版本的补丁:

shorebird patches list --release-version 1.1.0+2

以下假设待推广的实际补丁编号为 2:

shorebird patches set-track --release-version 1.1.0+2 --patch-number 2 --track stable

此参数形式需要 Shorebird CLI 1.6.128 或更新版本。移动通道无需重新构建,因而正式发布的是刚才验收过的补丁。预发布与推广流程

六、怎样证明用户真的更新成功

本文示例应用在启动后后台检查和下载,页面允许继续使用;也提供手动检查与重试。补丁就绪后,下一次完整启动才运行新代码。切到后台再返回,通常不等于应用进程重新启动。

一次实际验收可以这样做:

  1. 安装目标基础包,登录测试账号,创建一条测试数据并记录外观偏好。
  2. 在 Dart 中修改一处可识别的文案,发布补丁到待验收通道。
  3. 在已安装应用中检查更新,确认下载完成并提示更新就绪。
  4. 完全关闭并重新打开应用,确认新文案和当前补丁编号生效。
  5. 检查登录态、测试数据和外观偏好仍然保留,核心业务可以继续使用。
  6. 补测断网、下载失败后恢复网络重试,以及更新过程中继续编辑的行为。

记录基础版本、补丁编号、设备型号、系统版本和结果。自动测试证明代码行为,模拟器证明模拟器路径;真机触摸、网络变化和后台恢复需要对应设备证据。不要把“补丁上传成功”“显示下载完成”和“新代码已运行”合并成一个状态。

七、发现问题如何回滚

先定位出问题的平台、基础版本和补丁编号。可以在 Shorebird 控制台选中对应补丁回滚,也可以使用 CLI:

shorebird patches rollback --release-version 1.1.0+2 --patch-number 2

确认命令对应正确的平台补丁,并查看回滚结果。设备要再次检查更新、处理回滚并重新启动后,才运行之前可用的代码;离线设备不会立刻改变。

回滚当前补丁会退到该通道仍可用的前一个补丁,没有可用补丁时退到基础版本。如果多个后续补丁都有问题,需要核对整个回退链。代码回滚也不会自动撤销数据库内容或服务端数据变化,因此涉及存储结构的修改要考虑旧代码兼容性。回滚行为

八、保存一份发布记录

每次发布建议留下以下记录,便于复现和排查:

项目示例或记录内容
发布类型完整包 / Dart 补丁
平台与基础版本Android,1.1.0+2
补丁编号与通道补丁 2,stable
代码与工具链提交号、锁文件、Flutter / Shorebird 版本
构建参数flavor、入口、架构、必要的环境参数名称
交付产物安装包摘要、签名身份、分发位置
验收证据自动测试、模拟器、真机分别记录
回退方案回滚目标、兼容性检查、负责人

 

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
flutter2026-10-14
Flutter Android 正式签名实战:生成密钥、配置构建与验证 APK
Flutter Android 正式签名实战:生成密钥、配置构建与验证 APK Android 正式签名不需要购买证书。开发者可以自己生成密钥,用它给 APK 签名;密钥的用途是建立稳定的应用身份。签名有效并不等于应用已经通过商店审核,也不等于应用功能已完成真机验收。 本文面向 Flutter Android 项目,介绍从开发签名切换到独立正式签名的完整流程。应用名称、目录、包名和证书信息均使用通用示例,不包含真实项目密码、私钥、签名指...
学习
flutter2026-07-01
Dart 入门回顾
1\. Dart 是什么 Dart 是一门类型安全、支持面向对象、支持异步编程的语言。它的语法和 JavaScript、TypeScript、Java、C# 都有一些相似之处。 Dart 常见使用场景: Flutter 跨平台应用开发 命令行工具 Web 应用 服务端接口或脚本 作为学习现代类型语言的入口 Dart 的几个核心特点: 静态类型:变量、函数返回值、参数都有类型。 类型推断:很多时候可以用 ,让 Dart 自动推断类型。 空...
学习
flutter2026-07-01
Flutter 常用 Widget 入门
Flutter 的核心思想是:一切皆 Widget。文字、图片、按钮、页面结构、布局、间距、滚动、动画、手势,几乎都由 Widget 组合出来。 1\. Widget 先分成几类理解 | 类别 | 常用 Widget | 解决什么问题 | | | | | | 应用入口 | 、 | 搭建应用外壳、主题、路由 | | 页面骨架 | 、 、 | 标准页面结构 | | 基础显示 | 、 、 | 显示文字、图标、图片 | | 布局容器 | 、 、...
学习
flutter2024-11-21
在 Flutter 中使用 webview_flutter 4.0
1. 2. ,已入选 3. 4. 本文是第 4 篇,定位是新手入门,介绍和演示 webview 的基础用法。最后还介绍了事件处理的技巧。因为是补写的,所以本来应该首发的却发在最后了。 环境准备已经在 说过了,不再赘述。既然是新手入门,就会本着详尽的原则,而且会多配示例。 获取页面信息 获取页面 title 核心方法:controller.getTitle 完整示例,放在 main.dart 就能运行。运行示例,点击获取 title 的按...
学习
flutter2024-11-06
flutter android端运行报错Namespace not specified. Specify a namespace in the module‘s build file
在使用flutterSDK 3.24之后发现新建项目,项目默认都是基于AGP8了,由于 AGP 开始强制要求 namespace 配置,不仅仅是主工程,也包括第三方库都强制要求 namespace 。但是我们在引入第三方库的时候会发现部分库没能及时的去做相关配置,这也就导致了我们会出现标题错误: 出现这个问题,我们可能会通过去找到本地缓存的第三方库代码去修改它的build.gradle和AndroidManifest.xml来解决缺失...
学习
flutter2024-11-03
Flutter中如何实现APP升级功能背景
背景 每个App应用中一定会包含的功能 ,App的运行平台不同实现升级功能的方式也就不同,基本分类如下所示。本文主要聚焦在使用Flutter框架开发的应用在安卓系统内如何更新,以及所涉及要点梳理。 IOS系统 Andriod系统 官网下载 各类应用市场 (本文聚焦点) 功能清单(按步骤) UpgradeCard组件(展示升级内容) 进行新旧版本对比判断是否需要更新 下载更新然后安装应用 UpgradeCard组件 组件需要包含基本标题、...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录