Play Store 发布
准备签名、Play Console 配置、内部测试和发布流程。
Android distribution 的主线是 signed App Bundle、Play Console 设置、真实 testing tracks,以及生产 Supabase / RevenueCat wiring。应用内更新、应用内评价和真实购买都需要 Play-delivered build 才能完整验证。
发布前检查
| 项目 | 位置 |
|---|---|
| Package name | app/build.gradle.kts 中的 applicationId = "com.soarstarter.kotlin" |
| Version | versionName = "1.0.0",versionCode = 1 |
| SDK levels | minSdk = 26,targetSdk = 37 |
| Signing | git-ignored local.properties 中的 RELEASE_* keys |
| Legal links | LEGAL_TERMS_URL、LEGAL_PRIVACY_URL、LEGAL_EULA_URL |
| App Links | LINKING_DOMAIN + 托管的 .well-known/assetlinks.json |
| Monetization | Google 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_passwordGradle signing config 会 graceful degrade。如果 RELEASE_STORE_FILE 为空或指向不存在的文件,debug 和 CI builds 仍然能跑;release artifact 则保持 unsigned。上架 Play 时,建议启用 Play App Signing,并把这个 keystore 当作 upload key。
App Links
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 id | Store type |
|---|---|
pro_monthly | Google Play monthly auto-renewing subscription |
pro_yearly | Google Play yearly auto-renewing subscription |
pro_lifetime | Google 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_store;EntitlementController 读取这个 Supabase row。
Data safety
Play Console 会询问 APK/AAB 和启用的服务收集哪些数据。下表对应模板当前 shipped integrations。如果你不配置某个 key 或删除某个功能,请同步调整声明。
| 数据类型 | 是否收集 | 目的 | 来源 |
|---|---|---|---|
| Email address | 是 | 账号管理、身份认证 | Supabase Auth |
| User IDs | 是 | 账号管理、analytics、entitlement lookup | Supabase / PostHog / RevenueCat |
| Name and profile info | 用户填写时 | App functionality | profiles table |
| Photos or files | 用户上传时 | App functionality | Supabase Storage sample |
| Todos / user content | 使用 Todos 时 | App functionality | todos table |
| App interactions | 设置 PostHog key 时 | Analytics | PostHog |
| Crash logs and diagnostics | 设置 Sentry DSN 时 | App stability | Sentry |
| Device or advertising IDs | 发布 analytics/FCM 时 | Analytics、push delivery | PostHog / 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 | 验证内容 |
|---|---|
| Purchases | License tester 能购买,webhook 写入 subscriptions,Pro guides 解锁 |
| FCM | google-services.json 存在,send-test-push function 能发通知 |
| In-App Updates | MIN_APP_VERSION / LATEST_APP_VERSION 策略不会让当前版本反复提示 |
| In-App Review | Trigger logic 能请求 Play review 且不崩溃 |
| App Links | Domain verification 后 HTTPS links 能打开 app |
Internal 测试通过后,再按需要 promoted 到 Closed、Open 或 Production。
Review notes
Play review notes 建议说明:
| Topic | Note |
|---|---|
| In-app purchase | Monthly、yearly 和可选 lifetime products 会解锁 Showcase 下的 Pro developer guides |
| Test path | Reviewer 可从 Home 或 Me -> Subscription 进入 paywall |
| Promo codes | Redeem code 会打开 Google Play redemption |
| Account-gated screens | Reviewer 可以创建 email/password 测试账号 |
| Delete account | 提供 in-app path 和外部 account-deletion URL |
Release checklist
versionCode高于上一次 Play upload。- Release keystore 存在,
bundleRelease产出 signed.aab。 SUPABASE_URL和SUPABASE_PUBLISHABLE_KEY指向生产 project。- 如果模板 repo 还没补上
todos/profilesmigrations,请先应用缺失 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 已完成。
