ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Session Android发布流程全解:从签名构建到Play Store与F-Droid上架的完整指南

Session Android发布流程全解:从签名构建到Play Store与F-Droid上架的完整指南

【免费下载链接】session-android

Session Android - A Decentralized, Onion Routed, Private Messenger

项目地址:https://gitcode.com/gh_mirrors/ses/session-android
点击查看免费下载

Session Android 是一款去中心化、洋葱路由的私密即时通讯应用,其发布流程围绕四条 Git 分支策略、OS keyring 密钥管理和四个自动化脚本展开,最终将构建产物分别上架 Google Play Store、F-Droid 自托管仓库与 GitHub Release。本文带你完整走一遍这套发布流水线。

发布流程一图速览

一个完整的版本发布由 4 个脚本按顺序驱动,配合手动的人工审核步骤:

顺序脚本作用
1prepare-release.py创建release/版本号分支、提升版本号、推送并创建 GitHub草稿Release
2update-release-notes.py根据分支已合并 PR 的标题自动生成 Changelog,覆盖写入草稿
3build-and-release.py构建并签名 play / fdroid / huawei 三种 flavor,自动提交 F-Droid PR、上传产物到 GitHub 草稿
4play-store.py通过 Play Developer API 上传 AAB 到 Google Play 轨道

⚠️ 关键顺序:步骤 1(草稿)与签名凭据必须存在,build-and-release.py才能正常运行;update-release-notes.py必须在 PGP 签名追加之前执行,因为它会覆盖整个 Release 正文。

分支策略:master / dev / release

Session Android 采用经典的三分支模型:

分支用途
master生产分支,永远代表线上正在运行的版本
dev日常开发集成分支
release/MINOR.MAJOR.PATCH短期发布分支,构建发布产物
  • 完整版本发布:将dev整体合入 release 分支
  • 补丁版本发布:只 cherry-pick 需要的提交

版本号定义在 app/build.gradle.kts 的canonicalVersionCode与canonicalVersionName字段,prepare-release.py会自动 +1 并提交。

密钥管理:凭据一次存入 OS keyring

所有签名凭据不落盘,而是通过 _keyring.py 存入操作系统密钥环(macOS Keychain / Linux Secret Service)。凭据是一份 TOML 文档,包含三套密钥:

[build.play] # Play 签名(JKS 格式,base64 编码) [build.huawei] # 华为 AppGallery 签名 [fdroid] # F-Droid 签名(PKCS12 格式)

一次性存储命令(随后删除明文文件):

python3 scripts/_keyring.py set release-creds < release-creds.toml python3 scripts/_keyring.py set play-service-account < service-account.json

build-and-release.py还会通过ORG_GRADLE_PROJECT_*环境变量把密钥传给 Gradle(而非命令行参数),避免凭据出现在ps可读的进程参数中。

构建产物:三种 Flavor

Flavor产物用途
playAAB + split APKGoogle Play Store
fdroidsplit APKF-Droid 自托管仓库
huaweiuniversal APK华为 AppGallery(含 HMS 推送)

只想本地构建不发布?用--build-only即可:

./scripts/build-and-release.py --build-only

F-Droid 上架:自托管仓库的原理

F-Droid 不同于 Play Store 的"上传审核"模式,它采用仓库模型:一个 APK 目录 + 签名的索引文件(index-v1.jar/index-v2.json),客户端靠它发现可用版本。详细架构见 FDROID_RELEASE.md。

Session 选择自托管仓库(session-foundation/session-fdroid),因为:

  1. 自己保管签名密钥,控制发布时机
  2. 保留最近 4 个版本的 APK,供无法立即升级的用户使用
  3. 通过 PR 流程让每次更新都经过人工审核

fdroid update命令只负责索引预构建 APK 并签名索引文件,不构建、不签 APK。敏感文件config.yml与生成的 metadata 在发布时由.tpl模板渲染、用完即删,永远不会提交进仓库。

自动 PR 流程:克隆 fdroid 仓库 → 创建release/<version>分支 → 拷入新 APK 并清理旧版本 →fdroid update重新生成索引 → 提交 PR 等待人工合并。

Play Store 上架:轨道与分阶段发布

play-store.py通过服务账号 + Play Developer API 管理四个轨道:internal/alpha/beta/production。

常用命令:

scripts/play-store.py status # 查看各轨道当前版本与发布比例 scripts/play-store.py upload # 上传 AAB 到 internal 轨道(草稿,不提交) scripts/play-store.py upload --track production --submit # 全量发布 scripts/play-store.py upload --track production --rollout 0.1 # 10% 灰度 scripts/play-store.py rollout --track production 0.5 # 灰度升至 50%

两个实用技巧:

  • 无 API 自动爬坡:Play 不支持灰度自动递增,可以用 cron 定时执行rollout命令手动爬坡
  • Managed publishing 建议保持开启:提交后的版本会审核但停留在控制台等待你手动点 Publish,这是最后一道人工闸门

开发期快速验证:--play-only只构建 Play AAB,配合play-store.py share走 Internal App Sharing 免审装到模拟器,versionCode不消耗,适合频繁迭代。

常见问题速查

现象原因与解决
构建后 GitHub Release 没有产物草稿 Release 不存在时上传被静默跳过,先跑prepare-release.py
脚本报缺凭据keyring 中没有release-creds,用_keyring.py set存入一次
华为构建缺 HMS 依赖Gradle 命令需加-Phuawei参数
Changelog 覆盖了签名块update-release-notes.py必须在 PGP 签名之前运行

更多细节见仓库根目录的 RELEASE.md 与 scripts/README.md。

写在最后

Session Android 的发布流水线体现了一个成熟的开源项目的工程纪律:密钥零落盘、构建全自动、上架有人工闸门。四个脚本各司其职,把"从提交到用户可下载"压缩成了一条可重复执行的命令序列,同时 F-Droid PR 与 Play 的 managed publishing 保留了人类审核的关键节点——这正是它作为去中心化隐私通讯应用该有的发布姿态。

【免费下载链接】session-android

Session Android - A Decentralized, Onion Routed, Private Messenger

项目地址:https://gitcode.com/gh_mirrors/ses/session-android
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进