Flutter 打包发布太繁琐?开源一个本地 Flutter 多渠道自动化打包、IPA 构建和应用市场发布工具

0 阅读9分钟

一、写在前面

好久不见~

最近把自己本地使用的一套 Flutter 打包发布流程 整理了一下,做成了一个开源小工具,名字叫 Open Release Pilot

项目地址:

github.com/langyuxians…

GitHub 主页:

github.com/langyuxians…

如果你平时也会遇到这些问题:

  • Flutter Android 怎么做多渠道打包?
  • Flutter 怎么批量生成小米、华为、应用宝、蒲公英等渠道包?
  • Flutter iOS 怎么打 IPA?
  • iOS IPA 怎么上传 App Store Connect 或 TestFlight?
  • Android 包怎么上传蒲公英?
  • 应用市场发布参数、更新说明、审核备注怎么统一管理?
  • 打包记录、上传记录怎么保存在本地?
  • 测试同事要包时,怎么快速扫码安装?

那这个工具可能刚好适合你。

它不是 Jenkins,也不是 GitHub Actions 这种完整 CI/CD 平台,而是一个更轻量的 本地发布工作台

很多 Flutter 项目在发布阶段其实还是本机打包、本机确认、再上传应用市场。流程不复杂,但每次都要重复敲命令、找包、改文件名、复制更新日志、打开不同平台后台,就很容易出错。

Open Release Pilot 主要就是把这些重复工作放到一个本地 Web 面板里。

二、这个工具能做什么

Open Release Pilot 是一个面向 Flutter App 的本地可视化发布控制台,核心能力包括:

  • Flutter 项目配置管理
  • Android 多渠道打包
  • Android APK 输出目录和命名模板管理
  • iOS IPA 构建
  • App Store Connect / TestFlight 上传参数管理
  • 蒲公英上传
  • 华为、小米、应用宝、荣耀、OPPO、vivo 等应用市场发布配置
  • 发布说明和审核备注管理
  • 本地构建记录、上传记录保存
  • 局域网扫码安装 APK
  • 亮色、暗色、跟随系统主题切换

项目是一个本地 Node 服务,前端是静态 HTML/CSS/ES Modules,没有引入复杂框架,也不需要部署数据库。

本地数据默认保存在:

data/projects-db.json
data/release-db.json

这些文件默认已经被 .gitignore 忽略,不会提交到 GitHub。

三、先看一下界面

3.1 打包工作台

workbench.png

打包工作台主要用于查看当前项目、版本号、输出目录、Android 渠道包状态、iOS IPA 状态,也可以直接启动 Android 打包或 iOS 构建。

Android 这里可以选择渠道,比如蒲公英、小米、华为、应用宝等。

每个渠道会单独显示构建进度和日志,打包完成后可以看到 APK 路径。

3.2 分发管理

distribution.png

分发管理主要用于维护各个平台的发布参数。

比如:

  • 蒲公英 API Key
  • APK 路径
  • 应用市场 App ID
  • 包名
  • 发布说明
  • 审核备注
  • 测试账号
  • 图标和截图路径
  • 是否上传后提交审核

这里不是把所有平台都强行做成完全自动化,而是先把发布参数集中管理起来。

能走 API 的平台就走 API,暂时还需要人工确认的流程也可以作为发布清单来维护。

3.3 项目管理

projects.png

项目管理是整个工具的基础。

这里可以配置多个 Flutter / Android 项目,每个项目都有自己的:

  • 项目根目录
  • 版本文件
  • 版本号匹配规则
  • 构建号匹配规则
  • Android 输出目录
  • iOS 输出目录
  • APK 命名模板
  • IPA 命名模板
  • Android 渠道列表
  • iOS 发布配置
  • 应用市场配置

也就是说,如果你手里维护多个 Flutter App,不需要改代码切来切去,直接在页面里切换项目就可以。

四、安装和启动

项目地址:

github.com/langyuxians…

拉取项目:

git clone https://github.com/langyuxiansheng/open-release-pilot.git
cd open-release-pilot

启动:

npm start

启动成功后,终端会输出类似下面的地址:

Open Release Pilot: http://127.0.0.1:8787
Open Release Pilot LAN: http://192.168.1.10:8787

浏览器打开本机地址就可以使用。

如果端口被占用,可以换一个端口:

./start.sh --port 8788

查看端口状态:

./start.sh --status

停止服务:

./start.sh --stop

如果你只想本机访问,不想让局域网其它设备访问,可以这样启动:

HOST=127.0.0.1 npm start

五、第一次使用怎么配置

第一次打开页面后,先不要急着打包。

建议按这个顺序配置:

5.1 进入项目管理

把默认示例项目改成你自己的 Flutter 项目。

主要配置这些字段:

项目名称
项目根目录
应用短名
版本文件
版本号正则
构建号正则
Android 输出目录
iOS 输出目录
APK 命名模板
IPA 命名模板
渠道列表

Flutter 默认版本文件一般是:

android/local.properties

里面通常有:

flutter.versionName=1.0.0
flutter.versionCode=1

如果你的项目版本号不是从这里读,也可以在页面里修改版本文件和正则。

5.2 配置 Android 渠道

渠道配置类似这样:

[
  { "code": "PGYER", "dir": "pgyer", "name": "蒲公英" },
  { "code": "XIAOMI", "dir": "小米", "name": "小米" },
  { "code": "HUAWEI", "dir": "华为", "name": "华为" },
  { "code": "SJQQ", "dir": "sjqq", "name": "应用宝" }
]

其中:

  • code 是打包时传入的渠道值
  • dir 是输出目录
  • name 是页面展示名称

Android 打包脚本会执行:

flutter build apk --release --dart-define="TAG_CHANNEL=${CHANNEL}"

所以你的 Flutter 项目里可以这样读取渠道:

const channel = String.fromEnvironment('TAG_CHANNEL');

如果你的项目暂时不需要区分渠道,也可以先不处理这个值。

5.3 配置输出文件名

APK 命名模板支持:

{appSlug}
{versionName}
{versionCode}
{channel}

例如:

{appSlug}-{versionName}-{versionCode}-{channel}.apk

输出后大概是:

demo_app-1.0.0-1-XIAOMI.apk

iOS IPA 模板支持:

{appSlug}
{versionName}
{versionCode}

例如:

{appSlug}-{versionName}-{versionCode}.ipa

六、Android 多渠道打包流程

配置好项目后,进入「打包工作台」。

勾选需要构建的渠道,然后点击 Android 构建。

脚本会进入目标 Flutter 项目目录,每个渠道执行一次构建。

构建完成后,会把 APK 复制到:

{androidOutputRoot}/{versionName}/{channel.dir}/{apkNameTemplate}

例如:

~/Desktop/AndroidPackages/1.0.0/xiaomi/demo_app-1.0.0-1-XIAOMI.apk

这里有一个比较实用的逻辑:

如果目标渠道包已经存在,并且文件不是空的,脚本会自动跳过这个渠道。

比如打包到一半失败了,下次重新执行时,不需要全部从头开始。

如果想强制重打某个渠道,可以先在页面里删除对应 APK,再重新构建。

七、iOS IPA 构建和 TestFlight

iOS 这块目前支持三种模式:

模式说明
仅打包 IPA只构建 IPA,不上传
上传到 App Store Connect打包后上传到 App Store Connect
上传并用于 TestFlight上传后等待 Apple 处理,再到 TestFlight 配置测试

iOS 脚本执行的是:

flutter build ipa --export-options-plist="$IOS_EXPORT_OPTIONS_PLIST"

构建成功后,会把 IPA 复制到:

{iosOutputRoot}/{versionName}/{ipaNameTemplate}

iOS 这里需要注意的东西比较多:

  • Xcode 要配置好
  • 证书要正确
  • 描述文件要匹配
  • Bundle ID 要匹配
  • Team ID 要正确
  • ExportOptions plist 要和发布类型一致
  • App Store Connect API Key 要有效
  • .p8 私钥路径只能放本机

如果这些基础环境没配好,工具只能把错误日志展示出来,不能绕过 Apple 的签名和上传规则。

八、应用市场配置和上传

Open Release Pilot 目前内置了这些平台:

平台当前状态
蒲公英打包后上传流程已可用于实际发布
华为已接入 API 流程,建议先用测试应用验证
小米已接入自动发布字段和签名逻辑,建议先预检
应用宝主要面向已上线应用的信息和包更新
荣耀已接入 API 更新流程,提交审核前需要确认字段
OPPO已接入 API 更新流程,分类、素材、联系人字段要填全
vivo已接入 API 更新流程,版本号、包名、素材和签名要严格匹配

这里单独说明一下:

当前项目还在持续完善中,有些应用市场的字段和流程可能还不是最终形态。

目前 Android 打包流程蒲公英发布流程 是已经可以正常使用的,其它平台虽然已经接入了不少 API 流程和配置项,但不同账号的权限、后台字段、审核规则会有差异,正式使用前建议先用测试应用验证。

我个人建议的发布顺序是:

  1. 先填写基础字段,但保持 enabled=false
  2. 填 APK 路径、包名、App ID、发布说明。
  3. 执行查询或预检,确认账号和应用能匹配。
  4. 再打开 enabled
  5. 第一次先关闭 submitForReview,只做上传或更新。
  6. 去平台后台确认状态正常后,再决定是否提交审核。

这样比较稳,不容易因为字段没填全或者包传错而直接进入审核。

九、本地数据和敏感信息

这个项目定位是本地工具,所以会在本机保存一些配置和记录。

主要文件如下:

文件说明是否提交
config/stores.example.json开源示例配置可以提交
config/stores.local.json本机私有配置不要提交
data/projects-db.json项目配置和市场配置不要提交
data/release-db.json构建记录和上传记录不要提交

.gitignore 已经默认忽略这些本地数据。

但是如果你 fork 之后要公开发布,还是建议自己检查一下:

git status --short
git check-ignore -v config/stores.local.json data/projects-db.json data/release-db.json

还可以搜索一下自己的真实信息,比如:

包名
App ID
Team ID
API Key
手机号
测试账号
公司域名
本机私有路径

开源项目里一定不要提交真实证书、真实密钥和真实账号。

十、适合哪些人使用

我觉得这个工具比较适合这些场景:

  • Flutter 项目需要本机打包发布
  • Android 有多个渠道包
  • 需要固定输出目录和文件名
  • 发布前需要人工确认包和说明
  • 需要上传蒲公英给测试安装
  • 应用市场字段比较多,希望统一记录
  • 不想为了发布工具再部署数据库和后台服务
  • 一个开发者维护多个 Flutter App

如果你的团队已经有完整 CI/CD,例如 Jenkins、GitLab CI、GitHub Actions、Fastlane 全套自动化,那这个工具可能不是替代品。

它更适合作为本地发布辅助面板,尤其适合还在从手工发布过渡到自动化发布的项目。

十一、注意事项

这里再简单汇总一下使用注意事项:

  • 不要把发布面板暴露到公网。
  • 不要提交本地 data/*.json
  • 不要提交 config/stores.local.json
  • 不要提交 .p8.p12.mobileprovision.jks.keystore.cer 等文件。
  • 局域网扫码安装只建议在可信网络使用。
  • Android 打包前确认目标项目自己能执行 flutter build apk --release
  • iOS 打包前确认 Xcode、证书、描述文件、ExportOptions plist 都正确。
  • 应用市场上传前确认包名、版本号、签名、App ID、API 权限。
  • 第一次接入应用市场 API 时,建议先用测试应用验证。
  • submitForReview 这类提交审核开关不要一上来就打开。

十二、写在后面

Open Release Pilot 目前已经开源:

github.com/langyuxians…

项目还在继续完善中,后续会继续补充更多应用市场发布流程、字段校验和文档说明。

如果你也在做 Flutter 打包发布、Android 多渠道打包、iOS IPA 构建、蒲公英上传或者应用市场发布相关工作,可以 clone 下来试一下。

有问题可以在 GitHub 提 Issue,也可以留言交流。

感谢您的阅读,如果此文章或项目对您有帮助,请扫个二维码点个关注吧,若可以的话再给个一键三连吧!

公众号阅读的朋友可以点一下右下角的 在看分享 哦。

GitHub 有开源项目,需要的小伙伴可以顺手 star 一下!

GitHub: github.com/langyuxians…