背景:fastlane 在国内基本不能用
做过国内安卓发版的同学都懂这个痛 —— 一次发版要登 8 个后台:
华为 AppGallery、小米开放平台、OPPO、vivo、荣耀、应用宝、蒲公英、fir.im。
每家:
-
后台路径不一样
-
API 风格不一样(华为是 PS256 JWT,小米要 .cer 公钥证书,腾讯连 list 接口都没有)
-
错误码不一样(vivo 还分网关 code 和业务 subCode 两层)
-
异步任务行为不一样(OPPO 911216 是处理中,911215 是审核中要当成功)
fastlane?支持的是 Google Play 和 App Store。国内?没有。
所以多数团队的现状是:每家自己写一套脚本,PRD 一更新发版本,运维加班。
apkgo 是什么
一个 Go 写的开源 CLI,目标就是把上面这事做成一行命令:
apkgo upload -f app.apk --store huawei,xiaomi,oppo,vivo,honor,tencent
并发上传到所有配好的商店。结构化 JSON 输出,CI/CD 一等公民。
为什么我觉得它值得分享
1. doctor —— 上传前先验凭证
被坑过的人都懂:传了一个 100MB 的 APK,等了 5 分钟,最后告诉你"华为 service account 权限不够"。
apkgo doctor 在不传文件的前提下跑探针:
$ apkgo doctor -s huawei -p com.example.app
✓ token (200ms)
✓ appid-list (310ms) com.example.app → 100123456
✗ release-permission 应用未授予发布权限
3 个探针分别测:能不能拿 token、能不能用包名查到 appId、有没有发布权限。
任何一项失败,退出码 1,CI 直接挂掉,省得真传。
2. 凭证安全做到位
CI 里塞凭证大家都见过用 env、用文件、甚至用 hardcode 的。apkgo 提供:
-
--creds-from=stdin—— 从 Vault / AWS SM 取出来直接喂进去,全程不落盘不进 env -
apkgo config export --out config.enc—— AES-256-GCM + scrypt 加密导出,可以安全地 commit 到私有仓库,多机/多人同步 -
解析完立刻 zero-out 输入字节,避免 secret 留在缓冲区
对企业团队是刚需。
3. AI Agent 一等公民
这是我觉得最有意思的方向。apkgo 是 npm skills registry 的发布者:
npx skills add KevinGong2013/apkgo
Claude Code、Cursor、Windsurf 等 40+ AI Agent 一键装上。
然后你跟 agent 说:"帮我发个版到华为和小米",它自己调 apkgo 完成。
为这个场景,apkgo 的输出特别设计了 category 字段:
{
"store": "xiaomi",
"success": false,
"category": "policy_block",
"error": "签名不一致..."
}
```
把各家千奇百怪的错误码归成 8 个桶(success / already_done / auth_failed / network_retry / store_busy / policy_block / config_invalid / unknown),AI agent 不用解析中文错误就能决策要不要重试。
### 4. Web GUI 给非技术同事
不是所有团队都有专职 DevOps。`apkgo serve` 起本地 Web 界面:
```
$ apkgo serve
Listening on http://localhost:8080
```
拖 APK、勾商店、填日志、点上传。运营同事也能用。
不想本地装的,有托管版 https://apkgo.baici.tech,凭证云端托管,多人协作。
## 一个完整的 GitHub Actions 例子
```yaml
- name: Upload to app stores
env:
APKGO_HUAWEI_SERVICE_ACCOUNT: ${{ secrets.HUAWEI_SERVICE_ACCOUNT }}
APKGO_XIAOMI_EMAIL: ${{ secrets.XIAOMI_EMAIL }}
APKGO_XIAOMI_PRIVATE_KEY: ${{ secrets.XIAOMI_PRIVATE_KEY }}
APKGO_XIAOMI_CERT: ${{ secrets.XIAOMI_CERT }}
APKGO_OPPO_CLIENT_ID: ${{ secrets.OPPO_CLIENT_ID }}
APKGO_OPPO_CLIENT_SECRET: ${{ secrets.OPPO_CLIENT_SECRET }}
# ...
run: |
apkgo upload -f app/build/outputs/apk/release/app-release.apk \
--notes-file CHANGELOG.md \
--store huawei,xiaomi,oppo,vivo,tencent \
--timeout 15m
```
退出码语义化:0 全成功 / 1 部分失败 / 2 全失败 / 3 输入错。
## 最后
Apache 2.0,欢迎 star、issue、PR。被哪家商店坑过的同学也欢迎来吐槽,看看能不能给 doctor 加一个新探针。
仓库:https://github.com/KevinGong2013/apkgo