本文档旨在指导如何将基于 Capacitor 的移动端应用打包并发布至 Google Play 开发者商店。
在开始上架前,请准备好以下资源和账号:
512 x 512 像素,PNG 格式,最大 1MB。1024 x 500 像素,JPG 或 24 位 PNG,最大 1MB(用于在商店顶部展示,非常重要)。.jks 签名证书文件。./path-to/your-app-sign-key.jks# 查看jks里的信息
keytool -list -v -keystore ./path-to/your-app-sign-key.jks
找不到keytool的话:
# 查看jks里的信息
"/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/keytool" -list -v -keystore ./path-to/your-app-sign-key.jks
Google Play 商店目前强制要求新上架的应用必须提交 .aab 格式(Android App Bundle),而非 .apk。
在项目根目录下执行:
# 构建前端静态资源
npm run build -w @yourapp/app
# 将构建好的资源同步到 Android 目录
npx cap sync android
packages/app/android 目录。Build -> Generate Signed Bundle / APK...。Android App Bundle,点击 Next。.jks 文件,输入你的密码、别名和别名密码。release,点击 Create。app-release.aab 文件。如果你不想每次在本地手动打包,可以配置 GitHub Actions。当你在代码库推送形如 v1.0.0 的版本 Tag 时,GitHub 会自动完成构建、签名并生成 release 资源包。
首先,在项目的 .github/workflows/release.yml 路径下创建部署流程配置文件,定义好构建、签名与发布的 Action 配置:
name: Build & Release Android App
on:
push:
tags:
- 'v*' # 仅当推送形如 v1.0.0 的 tag 时触发
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- name: Install Dependencies
run: npm ci
- name: Build Frontend Web Assets
run: npm run build -w @yourapp/app
- name: Setup Java JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17' # Java 17 是目前 Gradle 编译 Android 推荐的版本
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Sync Capacitor Android
run: npx cap sync android
- name: Build Android AAB (Release)
run: |
cd android
./gradlew bundleRelease
- name: Sign Android App Bundle (AAB)
id: sign_app
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: android/app/build/outputs/bundle/release
signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }}
alias: ${{ secrets.ANDROID_ALIAS }}
keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}
- name: Create GitHub Release & Upload AAB
uses: softprops/action-gh-release@v2
with:
files: ${{ steps.sign_app.outputs.signedReleaseFile }}
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
进入你的 GitHub 仓库 Settings -> Secrets and variables -> Actions,添加/更新以下 Secrets:
ANDROID_SIGNING_KEY:本地 .jks 文件的 Base64 编码字符串(在 Mac 终端运行 base64 -i your-app-sign-key.jks 获取)ANDROID_KEY_STORE_PASSWORD:你的证书库密码ANDROID_ALIAS:别名ANDROID_KEY_PASSWORD:你的别名密钥密码每次需要发布新版时,在本地打上版本号标签并推送到 GitHub 即可:
git tag v1.0.3
git push origin v1.0.3
GitHub Actions 会自动编译生成签名的安装包并自动创建 Release。
登录 Google Play Console 开始创建应用。
在后台仪表盘的 "Set up your app" 部分,需要完成一系列表单声明:
当你向 Google Play 提交 .aab 格式文件时,Google 强制要求启用 Google Play 应用签名(Google Play App Signing)。这引入了一个非常普遍但致命的“签名指纹不匹配”大坑:
本地密钥 vs 谷歌签名密钥:
.jks):现在变成了“上传密钥 (Upload Key)”,Google Play 仅用它来验证是你上传的包。.aab 后,会在云端使用 Google 独立生成的密钥对应用重新进行签名,用户最终从商店下载到的 .apk 使用的是这个谷歌签名密钥。如果你的应用接入了 Google 登录、Firebase、微信登录/分享、支付宝/微信支付、高德/百度地图 等需要配置 SHA-256 或 MD5 证书指纹 的第三方 SDK,请务必进行以下操作:
.jks 提取出的 SHA-256 指纹。Setup -> App integrity (设置 -> 应用完整性)。App signing (应用签名) 标签页。因为签名指纹不匹配,如果你计划同时在自己官方网站分发 APK,并上架 Google Play,会遭遇严重的升级冲突:
冲突表现:
解决方案:
.jks 证书上传。这样两边的签名完全一致,可以无缝覆盖升级。// 伪代码:检测是否为谷歌商店渠道
const installer = await getInstallerPackageName(); // 原生对应 getInstallerPackageName()
if (installer === 'com.android.vending') {
// 禁用自定义应用内下载更新,引导至 Google Play 商店详情页
openPlayStore('market://details?id=your.package.name');
} else {
// 允许从官网下载 APK 进行覆盖升级
triggerLocalApkDownload();
}
谷歌个人开发者账号新规 (2023年11月起生效): 个人开发者账号在申请将应用发布到“生产环境(正式上架)”之前,必须进行封闭测试(Closed testing)。
Testing -> Closed testing。.aab 格式的 App Bundle 文件。当 14 天封闭测试结束,且 12 位测试人员全部达标后,你可以点击“申请发布到生产环境(Apply for Production)”。此时谷歌后台会强制要求你填写一份测试总结问卷。谷歌的人工审核员会仔细评估这份问卷,如果回答过于应付或不合逻辑(例如回答“没有任何 Bug,测试很完美”),申请将会被直接驳回,并被要求重新进行 14 天测试。
以下是控制台核心问题及高通过率的回答话术指引:
如果你的应用涉及加密解密,在上架审核时容易受到安全和加解密相关的额外关注:
AndroidManifest.xml 中的权限,确保只配置了最低要求的权限。不要申请不必要的敏感权限(如读取短信、读取联系人或定位权限),否则很容易会导致审核退回。SharedPreferences 的加密实现或 SQLite 数据库)。Capacitor 会自动处理沙盒隔离,确保其他应用无法越权读取数据。暂无评论,快来抢沙发吧!