国内 8 大安卓商店一行命令发版 —— 一个开源 CLI 干掉了 fastlane 在国内的空白

0 阅读2分钟

背景: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 一等公民。

仓库:github.com/KevinGong20…

为什么我觉得它值得分享

1. doctor —— 上传前先验凭证

被坑过的人都懂:传了一个 100MB 的 APK,等了 5 分钟,最后告诉你"华为 service account 权限不够"。

apkgo doctor 在不传文件的前提下跑探针:

$ apkgo doctor -s huawei -p com.example.app

✓ token         (200ms)
✓ appid-list    (310ms)  com.example.app100123456
✗ 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