第二十八章 发布与上架:从签名到商店的全流程

说实话,很多开发者觉得写代码是最难的。但在我看来,把写好的代码顺利送到用户手里,才是真正的考验。我自己就见过不少项目,功能做得挺好,结果卡在上架环节——签名不对、版本号冲突、商店审核被拒……折腾好几天。

这一章,咱们就把发布上架这件事彻底讲透。从签名生成开始,到 Google Play 和国内主流商店的上架流程,再到版本管理和多渠道打包。嗯,都是实战中一定会碰到的内容。

核心要点:发布上架不是最后一步,而是产品交付的起点。签名、版本号、渠道配置,任何一个细节出错,都可能让用户无法安装或更新。

应用签名:你的数字身份证

签名是什么?说白了,就是给 APK 打上一个独一无二的标记。Android 系统通过签名来识别应用的开发者身份。同一个包名,如果签名不一致,系统会认为这是两个不同的应用——这就是为什么你无法直接覆盖安装别人签名的 APK。

我个人习惯用 Android Studio 自带的签名工具,方便又不容易出错。当然,你也可以用命令行 keytool 来生成。

生成签名文件

在 Android Studio 里,操作路径是:Build → Generate Signed Bundle / APK。然后选择 APK(或者 AAB,后面会讲),点击 Create new... 来创建新的密钥库。

这里有几个关键字段,我重点说一下:

  • Key store path:密钥库文件的保存路径。建议放在项目根目录下,方便团队共享。
  • Password:密钥库密码。千万别忘了,忘了就废了。
  • Key alias:密钥别名。一个密钥库可以包含多个密钥,用别名区分。
  • Validity (years):有效期。Google Play 要求签名有效期至少到 2033 年 10 月 22 日之后。我一般直接填 30 年,省心。

⚠️ 我曾经犯过的错:有一次我把密钥库文件放在了桌面,后来清理桌面时顺手删了。结果应用要更新时才发现签名丢了……最后只能换包名重新上架,用户全丢了。所以,密钥库一定要备份!备份!备份!

签名配置

生成签名文件后,需要在 build.gradle 里配置签名信息:

android {
    signingConfigs {
        release {
            storeFile file("my-release-key.jks")
            storePassword "password"
            keyAlias "my-alias"
            keyPassword "password"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

注意:密码直接写在 gradle 文件里不安全。我建议把密码放在 gradle.properties 中,或者用环境变量读取。

💡 小技巧:gradle.properties 加入 .gitignore,避免密码泄露到版本库中。

Google Play 上架流程

Google Play 是全球最大的 Android 应用市场。上架流程其实不复杂,但有几个坑需要留意。

第一步:注册开发者账号

访问 play.google.com/console,用 Google 账号登录,支付 25 美元的一次性注册费。嗯,这个费用是永久的,之后不再收费。

第二步:准备应用信息

在 Google Play Console 里创建应用后,需要填写:

  • 应用名称和描述:简短有力,突出核心功能。
  • 截图和视频:至少 2 张截图,建议 8 张。我一般会准备一张功能全景图、几张核心操作截图、一张亮点展示图。
  • 应用类别和标签:选对类别有助于用户搜索到你的应用。
  • 隐私政策:如果你的应用收集任何用户数据(包括崩溃日志),必须提供隐私政策链接。

注意:从 2023 年底开始,Google Play 要求所有应用都必须通过至少 20 人的内部测试才能上架。这个测试期至少持续 14 天。所以,别等到最后一刻才想起测试的事。

第三步:上传应用包

Google Play 现在推荐使用 Android App Bundle(AAB)格式,而不是 APK。AAB 的好处是 Google Play 会根据用户的设备配置(屏幕密度、CPU 架构、语言等)动态生成最优的 APK,能有效减小安装包体积。

在 Android Studio 中生成 AAB:Build → Generate Signed Bundle / APK → Android App Bundle

第四步:审核与发布

提交后,Google 会进行自动化审核和人工审核。通常几个小时到几天不等。审核通过后,你可以选择「发布」或「分阶段发布」。我建议新应用先做 5% 的分阶段发布,观察崩溃率和用户反馈,没问题再全量发布。

国内应用商店上架

国内的情况比较特殊。商店多、规则杂、审核标准也不一样。我整理了几个主流商店的要点。

商店 开发者注册 审核周期 特殊要求
华为 企业/个人均可,需实名认证 1-3 个工作日 需提供软著或授权书;64 位架构必须支持
小米 企业/个人均可 1-2 个工作日 需提供隐私政策;应用内不能有「小米」相关敏感词
OPPO 企业/个人均可 2-5 个工作日 需提供软著;应用图标不能包含「官方」字样
vivo 企业/个人均可 1-3 个工作日 需提供软著;应用描述不能夸大宣传

你想想看,每个商店都要单独注册、单独上传、单独维护版本。如果手动操作,光是上传 APK 就能累死人。所以,后面讲的多渠道打包就派上用场了。

💡 我的经验:国内商店审核最常卡在「隐私政策」和「权限说明」上。建议在应用内做一个清晰的隐私政策页面,并在首次启动时弹窗告知用户权限用途。这个做法在 Google Play 和国内商店都适用。

版本管理:VersionCode 与 VersionName

这两个字段在 build.gradle 里定义:

android {
    defaultConfig {
        versionCode 3
        versionName "1.2.0"
    }
}

VersionCode 是一个整数,用于系统判断版本新旧。每次发布新版本,这个数字必须递增。Google Play 和国内商店都以此为准。我习惯用时间戳来生成 versionCode,比如 20250301 表示 2025 年 3 月 1 日发布的版本。这样一眼就能看出版本的新旧。

VersionName 是展示给用户看的版本号,比如 "1.2.0"。它遵循语义化版本规范:主版本号.次版本号.修订号。主版本号变化表示不兼容的 API 修改,次版本号变化表示新增功能但向后兼容,修订号变化表示 bug 修复。

⚠️ 我曾经踩过的坑:有一次我忘了更新 versionCode,直接用了和上一个版本相同的值。结果上传到 Google Play 时被拒绝,提示「版本号必须递增」。更麻烦的是,已经安装旧版本的用户无法收到更新通知。所以,我后来养成了一个习惯:每次打包前,先检查 versionCode 是否已递增。

多渠道打包

多渠道打包,说白了就是一次编译生成多个不同渠道的 APK。每个渠道的 APK 里会嵌入不同的渠道标识,方便统计各渠道的下载量和用户行为。

配置渠道

build.gradle 中定义渠道:

android {
    flavorDimensions "channel"
    productFlavors {
        google {
            dimension "channel"
            manifestPlaceholders = [CHANNEL_VALUE: "google"]
        }
        huawei {
            dimension "channel"
            manifestPlaceholders = [CHANNEL_VALUE: "huawei"]
        }
        xiaomi {
            dimension "channel"
            manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"]
        }
        oppo {
            dimension "channel"
            manifestPlaceholders = [CHANNEL_VALUE: "oppo"]
        }
    }
}

然后在 AndroidManifest.xml 中引用渠道占位符:

<meta-data
    android:name="CHANNEL"
    android:value="${CHANNEL_VALUE}" />

这样,打包时每个渠道的 APK 都会自动替换 ${CHANNEL_VALUE} 为对应的渠道名。

打包命令

在终端执行:

./gradlew assembleRelease

这条命令会生成所有渠道的 Release 版本 APK。如果你只想打某个渠道的包:

./gradlew assembleHuaweiRelease

生成的 APK 在 app/build/outputs/apk/ 目录下,按渠道分文件夹存放。

💡 效率提升:如果渠道很多(比如几十个),建议用 ./gradlew assembleRelease 一次生成所有渠道包。我见过有些团队用脚本批量上传到各个商店,配合 CI/CD 流水线,从代码提交到上架全自动化。

知识体系总览

下面这张图帮你梳理本章的核心逻辑:

发布与上架知识体系 应用发布与上架 应用签名 • 密钥库生成 • 签名配置 • 密钥备份 Google Play • 开发者注册 • AAB 格式 • 内部测试 国内商店 • 华为/小米/OPPO • 软著与隐私政策 • 审核差异 版本管理 • VersionCode • VersionName 多渠道打包 • productFlavors • 渠道标识

这张图把本章的五个核心知识点串在了一起。你可以看到,签名是基础,版本管理是规范,多渠道打包是效率工具,而 Google Play 和国内商店是最终交付的出口。每一步都环环相扣。

好了,这一章的内容就到这里。记住,发布上架不是终点,而是产品与用户见面的起点。把流程标准化、自动化,你就能把更多精力放在真正重要的事情上——把产品做好。


公众号:蓝海资料掘金营,微信 deep3321