English version: github-actions-android-release.en.md
这个仓库已经配置好了 Android 发布工作流:
- 工作流文件:
/.github/workflows/android-release.yml - 触发方式:推送形如
v0.0.1的 tag - 发布产物:已签名 32 位
APK、64 位APK、AAB、SHA256SUMS.txt - 发布位置:GitHub Release
当你执行下面这类命令后:
git tag v0.0.1
git push origin v0.0.1GitHub Actions 会自动执行:
- 检出代码。
- 安装 Node.js、Java、Android SDK / Build Tools / NDK。
- 执行
npm ci。 - 从 tag 推导 Android 版本号。
- 从 GitHub Secrets 动态重建签名 keystore。
- 构建签名后的 32 位、64 位
APK,以及AAB。 - 生成
SHA256SUMS.txt。 - 创建或更新对应的 GitHub Release,并上传产物。
工作流会匹配 v* 开头的 tag,但真正构建前还会继续校验版本格式。
当前要求 tag 必须是三段式数字版本:
v0.0.1v0.1.0v1.2.3
不符合这个格式会直接失败。
工作流会从 tag 自动提取:
versionName = tag 去掉前缀 vversionCode = major * 1000000 + minor * 1000 + patch
例如:
v0.0.1->versionName = 0.0.1,versionCode = 1v1.2.3->versionName = 1.2.3,versionCode = 1002003
进入仓库:
Settings -> Secrets and variables -> Actions -> New repository secret
然后新增下面 4 个 Secrets:
ANDROID_KEYSTORE_BASE64ANDROID_KEYSTORE_PASSWORDANDROID_KEY_ALIASANDROID_KEY_PASSWORD
你的本地 keystore 路径是:
E:\key\fileFlash.jks
在 PowerShell 中执行:
[Convert]::ToBase64String([IO.File]::ReadAllBytes('E:\key\fileFlash.jks')) | Set-Clipboard执行后,剪贴板中的内容就是完整的 Base64 字符串,把它粘贴到 ANDROID_KEYSTORE_BASE64 即可。
如果你想先导出到文件再复制,也可以执行:
[Convert]::ToBase64String([IO.File]::ReadAllBytes('E:\key\fileFlash.jks')) | Out-File -Encoding ascii .\fileFlash.jks.base64工作流会在 GitHub Runner 中执行下面这一步:
printf '%s' "${ANDROID_KEYSTORE_BASE64}" | base64 --decode > "${RUNNER_TEMP}/fileflash-release.jks"这样做的好处是:
.jks文件不用提交到仓库- keystore 只会在 CI 运行期间临时生成
- 构建完成后 Runner 会被回收
当前工作流使用的是:
- Node.js
22.13.0 - Java
17 - Android Platform
android-36 - Build Tools
36.0.0 - NDK
27.1.12297006
工作流会上传下面这些文件到 GitHub Release:
android/app/build/outputs/apk/release/app-armeabi-v7a-release.apkandroid/app/build/outputs/apk/release/app-arm64-v8a-release.apkandroid/app/build/outputs/bundle/release/app-release.aabandroid/app/build/outputs/SHA256SUMS.txt
如果不是 vX.Y.Z 这种格式,工作流会在版本解析步骤失败。
如果缺少 keystore 或密码相关 Secret,签名构建会失败。
如果 ANDROID_KEYSTORE_BASE64 复制时被截断,CI 解码出的 keystore 会损坏,最终会在签名阶段报错。
每次发版前建议确认:
package.json中的版本语义和 tag 计划一致- Android 构建本地至少能通过一次
- 4 个 GitHub Secrets 已经正确配置
- tag 使用正式版本号,例如
v0.0.1