Play Store 发布

准备签名、Play Console 配置、内部测试和发布流程。

Android distribution 的主线是 signed App Bundle、Play Console 设置、真实 testing tracks,以及生产 Supabase / RevenueCat wiring。应用内更新、应用内评价和真实购买都需要 Play-delivered build 才能完整验证。

发布前检查

项目位置
Package nameapp/build.gradle.kts 中的 applicationId = "com.soarstarter.kotlin"
VersionversionName = "1.0.0"versionCode = 1
SDK levelsminSdk = 26targetSdk = 37
Signinggit-ignored local.properties 中的 RELEASE_* keys
Legal linksLEGAL_TERMS_URLLEGAL_PRIVACY_URLLEGAL_EULA_URL
App LinksLINKING_DOMAIN + 托管的 .well-known/assetlinks.json
MonetizationGoogle Play products + RevenueCat pro entitlement
Backend生产 Supabase project、migrations、functions、secrets

如果要用自己的包名发布,请在第一次 Play upload 前修改 applicationId。第一次上传后,package name 基本就是这个 app 的身份。

签名

一次性生成 upload keystore:

keytool -genkey -v -keystore soar-upload.jks -keyalg RSA -keysize 2048 \
  -validity 10000 -alias soar-upload

把 release keys 加到 local.properties

RELEASE_STORE_FILE=soar-upload.jks
RELEASE_STORE_PASSWORD=your_store_password
RELEASE_KEY_ALIAS=soar-upload
RELEASE_KEY_PASSWORD=your_key_password

Gradle signing config 会 graceful degrade。如果 RELEASE_STORE_FILE 为空或指向不存在的文件,debug 和 CI builds 仍然能跑;release artifact 则保持 unsigned。上架 Play 时,建议启用 Play App Signing,并把这个 keystore 当作 upload key。

LINKING_DOMAIN 会作为 Android manifest 的 host placeholder。要让 HTTPS App Links 通过验证,需要托管:

https://<your-domain>/.well-known/assetlinks.json

文件中必须包含 package name 和 release signing certificate 的 SHA-256 fingerprint。本地可以保留 soar:// custom scheme,但公开 URL 应优先使用 verified App Links。

Products 和 entitlement

模板预期 RevenueCat entitlement id 为 pro,并使用这些 product ids:

Product idStore type
pro_monthlyGoogle Play monthly auto-renewing subscription
pro_yearlyGoogle Play yearly auto-renewing subscription
pro_lifetimeGoogle Play one-time in-app product

把这些 products 绑定到 RevenueCat 的 pro entitlement 和当前 Android offering。App 会渲染 offering 返回的 package 子集。

App 不把 RevenueCat CustomerInfo 当作 entitlement source of truth。购买事件会通过 revenuecat-webhook Edge Function 写入 public.subscriptions,并带上 provider = play_storeEntitlementController 读取这个 Supabase row。

Data safety

Play Console 会询问 APK/AAB 和启用的服务收集哪些数据。下表对应模板当前 shipped integrations。如果你不配置某个 key 或删除某个功能,请同步调整声明。

数据类型是否收集目的来源
Email address账号管理、身份认证Supabase Auth
User IDs账号管理、analytics、entitlement lookupSupabase / PostHog / RevenueCat
Name and profile info用户填写时App functionalityprofiles table
Photos or files用户上传时App functionalitySupabase Storage sample
Todos / user content使用 Todos 时App functionalitytodos table
App interactions设置 PostHog key 时AnalyticsPostHog
Crash logs and diagnostics设置 Sentry DSN 时App stabilitySentry
Device or advertising IDs发布 analytics/FCM 时Analytics、push deliveryPostHog / Firebase / AD_ID permission

网络数据应声明 encrypted in transit。Privacy policy URL 是必填项,建议与 LEGAL_PRIVACY_URL 保持一致。

当前 in-app delete-account 只是客户端清理:删除用户 todos、置空 profile 字段,并在本机退出。它不会删除 Supabase Auth user。Google Play 账号删除政策期望真实删除路径,因此发布前请 port 或新增服务端 delete-account Edge Function。

构建和上传

先跑质量检查:

./gradlew testDebugUnitTest lintDebug

构建 App Bundle:

./gradlew bundleRelease

输出路径:

app/build/outputs/bundle/release/app-release.aab

先把 .aab 上传到 Internal testing。添加 testers,通过 Play opt-in link 安装,然后从这个 Play-delivered build 中测试 Play-only surfaces:

Surface验证内容
PurchasesLicense tester 能购买,webhook 写入 subscriptions,Pro guides 解锁
FCMgoogle-services.json 存在,send-test-push function 能发通知
In-App UpdatesMIN_APP_VERSION / LATEST_APP_VERSION 策略不会让当前版本反复提示
In-App ReviewTrigger logic 能请求 Play review 且不崩溃
App LinksDomain verification 后 HTTPS links 能打开 app

Internal 测试通过后,再按需要 promoted 到 Closed、Open 或 Production。

Review notes

Play review notes 建议说明:

TopicNote
In-app purchaseMonthly、yearly 和可选 lifetime products 会解锁 Showcase 下的 Pro developer guides
Test pathReviewer 可从 Home 或 Me -> Subscription 进入 paywall
Promo codesRedeem code 会打开 Google Play redemption
Account-gated screensReviewer 可以创建 email/password 测试账号
Delete account提供 in-app path 和外部 account-deletion URL

Release checklist

  • versionCode 高于上一次 Play upload。
  • Release keystore 存在,bundleRelease 产出 signed .aab
  • SUPABASE_URLSUPABASE_PUBLISHABLE_KEY 指向生产 project。
  • 如果模板 repo 还没补上 todos / profiles migrations,请先应用缺失 schema。
  • revenuecat-webhook 已部署,并设置 REVENUECAT_WEBHOOK_AUTH
  • 如果 reviewer 需要测试 push,send-test-push 已部署,并设置 Firebase Admin secrets。
  • REVENUECAT_ANDROID_KEY 已设置,Play products 已激活。
  • Listing 创建后,APP_UPDATE_URL 指向 Play listing。
  • Legal URLs 可通过 HTTPS 访问。
  • App icon、feature graphic、phone screenshots、tablet screenshots 已上传。
  • Data safety、privacy policy、app access、ads、content rating、target audience forms 已完成。

相关页面

On this page