跳到主要内容

架构与目录

系统定位

该仓库是设备管理 / IoT SaaS 的 原生 Android 客户端内核

  • 默认路径:单 App、多 feature 模块、离线优先数据层
  • 可选演进:在真实压力出现时再拆独立交付单元(业务边界已在 feature 内)

优先:可维护、可测、可发布,而不是最大化模块数量。

仓库布局(核心)

app/ # MainActivity、应用图、主题、发布日志策略
core/
model/ # 领域模型(纯 Kotlin)
common/ # AppResult 等通用类型
designsystem/ # Material 3 主题
ui/ # 共享 Compose 组件
domain/ # 领域侧扩展点(按仓库实际)
data/ # Repository、离线协调、mapper
database/ # Room entity / DAO / Database
datastore/ # 会话、Admin Token、端点、偏好
network/ # Retrofit、DTO、拦截器、API
feature/
auth/ devices/ commands/ telemetry/ ...
docs/ # ARCHITECTURE、SECURITY、RELEASE…
gradle/libs.versions.toml
settings.gradle.kts

业务 feature 列表会随产品增长(alerts、automation、vendor、workforce…),以 settings.gradle.kts 为准。

依赖方向(硬边界)

:app
→ :feature:*
→ :core:*

:feature:*
→ :core:data, :core:ui, :core:designsystem, :core:model, …

:core:data
→ :core:database, :core:network, :core:datastore, :core:model, :core:common

:core:network / database / datastore
→ 不依赖 app、不依赖 feature

要点:

  • feature 之间不直接依赖
  • core 不依赖 feature;若 app 屏要嵌 feature UI,从 feature 暴露 Composable,由 app 组合
  • 不要为了省事 implementation(project(":feature:other"))

运行时图(导航)

应用大致处于三种图之一:

状态
未登录Auth
已登录但未选组织Organization picker
已登录且已选组织Main

Main 常见底部 Tab(以仓库实现为准):

  • Dashboard(Home)
  • Devices
  • Commands
  • More(遥测、告警、自动化、通知、集成、设置、诊断、组织切换、退出等)

Admin 相关入口仅对具备管理员能力的用户可见。

状态流(UDF)

Repository (Flow / suspend)
→ ViewModel (StateFlow<UiState>)
→ Composable (collectAsStateWithLifecycle)
→ 用户事件回到 ViewModel
  • UI 不可变状态向下、事件向上
  • 使用 collectAsStateWithLifecycle(),避免无效收集
  • 业务逻辑优先落在 Repository / 合适的 domain,而不是 Composable

数据层直觉

默认 offline-first

  1. UI 观察 Room 支持的缓存(observe*Flow
  2. 进入屏或下拉时 Repository refresh* / 写操作走 Retrofit
  3. 网络 DTO → domain model → Room entity(mapper 分目录)
  4. 有缓存的屏以 Room 为当前展示真相源

Token、Admin Token、运行时 API 端点在 DataStore不进 Room

网络层直觉

  • Retrofit + OkHttp
  • JSON:kotlinx.serialization 单例 JsonignoreUnknownKeys 等见实现)
  • 拦截器职责拆分清晰:
    • AuthInterceptorAuthorization: Bearer …
    • AdminTokenInterceptor:仅 /internal/admin/*X-Admin-Token
    • TokenAuthenticator:401 单飞刷新
    • DynamicBaseUrlInterceptor:Settings / 构建参数覆盖的端点

与 Go 后端的对应关系

AndroidGo base(概念)
feature/*用户可感知的产品切片(屏 + VM)
core:data repositoriesapplication 用例的客户端侧编排
core:network DTO/APIHTTP 契约 / OpenAPI
core:model跨层稳定模型(非 wire DTO)
DataStore session服务端会话在客户端的投影

两端边界文档见 Go 仓库 OpenAPI 与 Android docs/API_COVERAGE.md

下一步:模块怎么写