概览
使用 Supabase、RevenueCat、推送通知和分析能力的功能完备 Jetpack Compose Android 启动模板。
Kotlin (Android) 模板是面向手机和平板的功能完备 Jetpack Compose 启动模板。它已经接好 Supabase 后端、RevenueCat 订阅、账号绑定的 Pro 权益、Firebase Cloud Messaging、深度链接、分析、崩溃上报以及 Android 应用启动门禁。
上述 Android 基础设施真实可用且已集成完毕。部分产品界面是 Example 或 Removable demo,发布前应该替换成你自己的业务。
最低 SDK:26。目标 SDK:37。应用 id:
com.soarstarter.kotlin。
优雅降级
模板从 local.properties 读取本地 Android 配置,并生成 BuildConfig
字段。缺失的字符串键会变成空字符串,相关控制器会先检查这些值再启动服务。
因此你可以先完成构建和启动,再逐步接入 Supabase、RevenueCat、FCM、
PostHog、Sentry、发布签名和 App Links。详见
配置。
技术栈
| 层级 | 选择 |
|---|---|
| UI | Jetpack Compose + Material 3 |
| 架构 | MVVM (ViewModel + StateFlow) + Repository pattern |
| 依赖注入 | Hilt + KSP |
| 导航 | Navigation Compose,使用类型安全的 @Serializable 路由 |
| 后端 | supabase-kt (Auth, PostgREST, Storage, Edge Functions) |
| 网络 | Ktor OkHttp engine + Coroutines / Flow |
| 持久化 | DataStore Preferences 保存应用状态;supabase-kt 通过 SettingsSessionManager 恢复认证会话 |
| 图片加载 | Coil 3 |
| 推送 | Firebase Cloud Messaging |
| 订阅 | RevenueCat 购买 + Supabase 权益读模型 |
| 分析 | PostHog Android SDK |
| 崩溃上报 | Sentry Android SDK |
| 生物识别 | androidx.biometric / BiometricPrompt |
| Play 服务 | Play In-App Updates + Play In-App Review |
| 深度链接 | App Links + 自定义 soar:// scheme |
| 国际化 | values/strings.xml + values-zh/strings.xml,支持运行时语言切换 |
功能状态
这些文档会统一使用以下状态标签:
- Integrated — 已完整接好;配置对应 key 或服务后启用。
- Example — 可运行的示例功能,预期替换成你的业务。
- Removable demo — Showcase 标签页和门禁指南;代码中已标出删除边界。
- Play-only — 需要 Google Play 服务或通过 Play 分发的构建。
| 功能 | 状态 | 说明 |
|---|---|---|
| 身份认证 | Integrated | 邮箱/密码、注册邮件 OTP、忘记/重置密码、改邮箱/密码、登出其他会话 |
| Google 登录 | Integrated | Android Credential Manager ID token -> Supabase;GOOGLE_WEB_CLIENT_ID 为空时隐藏 |
| 个人资料 | Example | 头像、个人信息、账号安全、主题和语言设置 |
| Todos | Example | 完整 CRUD 参考功能;位于 Home 栈,不是独立标签页 |
| 上传示例 | Example | Photo picker -> Supabase Storage 存储桶 sample-uploads |
| 订阅 | Integrated | RevenueCat 购买界面;权益来源是 Supabase subscriptions 读模型 |
| 推送通知 | Integrated | FCM token 注册、站内收件箱、登录态测试推送函数 |
| 深度链接 | Integrated | soar:// 和基于 LINKING_DOMAIN 的 HTTPS App Links |
| 分析 | Integrated | PostHog identify/reset 和类型化事件 |
| 崩溃上报 | Integrated | Sentry 初始化、ErrorBoundary、用户标记、反馈事件 |
| 应用门禁 | Integrated | 生物识别锁、更新门禁、引导、法律同意、认证路由 |
| 权限预热 | Integrated | 通知、相机和广告 ID 跟踪说明界面 |
| 商店评价 | Play-only | Google Play In-App Review 智能触发 |
| 应用内更新 | Play-only | 强制/柔性更新提示;可回退到 Play URL |
| 国际化 | Integrated | 英文 + 简体中文;通过 LocaleController 和 LocalizedAppHost 运行时切换 |
| 主题 | Integrated | 浅色、深色、跟随系统和动态色,保存到 DataStore |
| 离线提示 | Integrated | 基于连接状态的 OfflineBanner 组件 |
| Toast / 触觉反馈 | Integrated | 顶部 toast host,成功/错误触觉反馈 |
| 推荐好友 | Example | 通过 ACTION_SEND 调起 Android 分享面板 |
| 组件图库 | Example | 本地 Compose 组件目录和详情 demo |
| Showcase + 指南 | Removable demo | 四标签主壳包含 Showcase;开发者指南在其中受购买门禁保护 |
应用界面地图
应用从外到内由三层组成:
- Activity host —
MainActivity应用主题和语言,然后用BiometricGate -> ErrorBoundary -> AppNavGraph包住应用,并在导航内容上方挂载ToastHost。 - 门禁栈 —
AppNavGraph按UpdateGate -> OnboardingGate -> ConsentGate的顺序检查,然后挂载主导航。需要登录的操作会推入认证路由;SessionController.currentUser变成非空后会弹出认证图。 - 主壳 —
MainShellRoute管理四个标签页(Home、Component、 Showcase、Me)和导航抽屉。Todos 位于 Home 图内 (AppRoutes.Todos),所以它是示例功能,不是第五个标签页。
跨平台权益
Android 应用把 public.subscriptions 作为账号权益的事实来源。
RevenueCat 负责 Google Play 购买和恢复购买流程,随后
revenuecat-webhook Edge Function 将 provider = play_store 的记录写入
Supabase。EntitlementController 通过 SubscriptionRepository 读取这张表;
账号门禁界面不会把 RevenueCat CustomerInfo 当作解锁来源。RevenueCat 权益 id
是代码常量 pro。
