概览

使用 Supabase、RevenueCat、推送通知和分析能力的功能完备 Jetpack Compose Android 启动模板。

Kotlin (Android) 模板是面向手机和平板的功能完备 Jetpack Compose 启动模板。它已经接好 Supabase 后端、RevenueCat 订阅、账号绑定的 Pro 权益、Firebase Cloud Messaging、深度链接、分析、崩溃上报以及 Android 应用启动门禁。

上述 Android 基础设施真实可用且已集成完毕。部分产品界面是 ExampleRemovable demo,发布前应该替换成你自己的业务。

最低 SDK:26。目标 SDK:37。应用 id: com.soarstarter.kotlin

优雅降级

模板从 local.properties 读取本地 Android 配置,并生成 BuildConfig 字段。缺失的字符串键会变成空字符串,相关控制器会先检查这些值再启动服务。 因此你可以先完成构建和启动,再逐步接入 Supabase、RevenueCat、FCM、 PostHog、Sentry、发布签名和 App Links。详见 配置

技术栈

层级选择
UIJetpack 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 登录IntegratedAndroid Credential Manager ID token -> Supabase;GOOGLE_WEB_CLIENT_ID 为空时隐藏
个人资料Example头像、个人信息、账号安全、主题和语言设置
TodosExample完整 CRUD 参考功能;位于 Home 栈,不是独立标签页
上传示例ExamplePhoto picker -> Supabase Storage 存储桶 sample-uploads
订阅IntegratedRevenueCat 购买界面;权益来源是 Supabase subscriptions 读模型
推送通知IntegratedFCM token 注册、站内收件箱、登录态测试推送函数
深度链接Integratedsoar:// 和基于 LINKING_DOMAIN 的 HTTPS App Links
分析IntegratedPostHog identify/reset 和类型化事件
崩溃上报IntegratedSentry 初始化、ErrorBoundary、用户标记、反馈事件
应用门禁Integrated生物识别锁、更新门禁、引导、法律同意、认证路由
权限预热Integrated通知、相机和广告 ID 跟踪说明界面
商店评价Play-onlyGoogle Play In-App Review 智能触发
应用内更新Play-only强制/柔性更新提示;可回退到 Play URL
国际化Integrated英文 + 简体中文;通过 LocaleControllerLocalizedAppHost 运行时切换
主题Integrated浅色、深色、跟随系统和动态色,保存到 DataStore
离线提示Integrated基于连接状态的 OfflineBanner 组件
Toast / 触觉反馈Integrated顶部 toast host,成功/错误触觉反馈
推荐好友Example通过 ACTION_SEND 调起 Android 分享面板
组件图库Example本地 Compose 组件目录和详情 demo
Showcase + 指南Removable demo四标签主壳包含 Showcase;开发者指南在其中受购买门禁保护

应用界面地图

应用从外到内由三层组成:

  • Activity hostMainActivity 应用主题和语言,然后用 BiometricGate -> ErrorBoundary -> AppNavGraph 包住应用,并在导航内容上方挂载 ToastHost
  • 门禁栈AppNavGraphUpdateGate -> OnboardingGate -> ConsentGate 的顺序检查,然后挂载主导航。需要登录的操作会推入认证路由; SessionController.currentUser 变成非空后会弹出认证图。
  • 主壳MainShellRoute 管理四个标签页(HomeComponentShowcaseMe)和导航抽屉。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

从这里开始

On this page