# 00 — 项目概述与架构

> 对应主项目 Phase 5（v1.5 → v2.0）Android 客户端  
> 主项目文档：`../../docs/dev-plan/04-voice-system-plan.md`

---

## 1. 项目定位

Cyrene for Android 是昔涟的官方 Android 客户端，定位为 **可替换系统自带语音助手的智能体 APP**（替代 Google Assistant / Bixby）。

核心差异点：
- 不是传统 APP（以桌面图标为主要入口），而是**系统级语音助手**
- 除常规全屏 Activity 外，通过 `VoiceInteractionSession` 提供悬浮式覆盖层交互
- 支持息屏热词唤醒、长按 Home / 电源键呼出

## 2. 技术栈

| 层 | 技术 | 版本要求 |
|----|------|---------|
| 语言 | Kotlin | 2.0+ |
| UI 框架 | Jetpack Compose + Material Design 3 | BOM 2025+ |
| 构建 | Gradle (Kotlin DSL) | 8.7+ |
| 架构模式 | MVVM + Repository | — |
| 依赖注入 | Hilt / Koin (待定) | — |
| 网络 | Retrofit + OkHttp | — |
| 实时通信 | OkHttp WebSocket | — |
| 本地存储 | Room (SQLite) + DataStore | — |
| 推送 | FCM (Firebase Cloud Messaging) | — |
| 系统语音 | VoiceInteractionService | API 23+ |
| 热词唤醒 | Always-On Hotword Detection | API 23+ |
| 语音识别 | 服务端 (Whisper API) + 本地兜底 | — |

## 3. 最低系统要求

| 项目 | 要求 |
|------|------|
| minSdk | 26 (Android 8.0) |
| targetSdk | 35+ |
| compileSdk | 35+ |
| JDK | 17 |
| Gradle | 8.7+ |

注：`VoiceInteractionService` 基础 API 要求 23，`AssistAction` 热词唤醒要求 23。minSdk 设为 26 以覆盖绝大多数活跃设备并简化兼容性。

## 4. 项目结构

```
android/
├── app/
│   ├── src/main/
│   │   ├── java/com/cyrene/app/
│   │   │   ├── CyreneApplication.kt       # Application 初始化
│   │   │   ├── MainActivity.kt            # 全屏主界面 (桌面图标入口)
│   │   │   ├── ui/
│   │   │   │   ├── theme/                 # MD3 主题 (Color / Type / Shape)
│   │   │   │   ├── screens/               # 全屏页面 (Compose)
│   │   │   │   │   ├── chat/              # 对话页
│   │   │   │   │   ├── home/              # 首页 / IoT 面板
│   │   │   │   │   ├── settings/          # 设置页
│   │   │   │   │   └── login/             # 登录/注册
│   │   │   │   ├── overlay/               # 悬浮窗对话界面 (VoiceInteractionSession)
│   │   │   │   └── components/            # 共享组件库
│   │   │   ├── viewmodel/                 # ViewModel 层
│   │   │   ├── domain/                    # 领域层 (UseCase / Repository 接口)
│   │   │   ├── data/
│   │   │   │   ├── remote/                # API 接口定义 + DTO
│   │   │   │   ├── local/                 # Room DAO + DataStore
│   │   │   │   └── repository/            # Repository 实现
│   │   │   ├── service/
│   │   │   │   ├── CyreneVoiceInteractionService.kt
│   │   │   │   ├── CyreneVoiceInteractionSession.kt
│   │   │   │   ├── CyreneAssistService.kt
│   │   │   │   └── WebSocketService.kt
│   │   │   ├── voice/
│   │   │   │   ├── hotword/               # 热词唤醒引擎
│   │   │   │   ├── stt/                   # 语音识别客户端
│   │   │   │   └── tts/                   # 语音合成客户端
│   │   │   ├── di/                        # DI 模块定义
│   │   │   └── util/                      # 工具类
│   │   ├── res/                           # 资源文件
│   │   └── AndroidManifest.xml
│   └── build.gradle.kts
├── gradle/
│   ├── libs.versions.toml                 # 版本目录
│   └── wrapper/
├── build.gradle.kts                       # 根构建脚本
├── settings.gradle.kts
└── gradle.properties
```

## 5. 架构分层

```
┌──────────────────────────────────────────────┐
│  UI Layer (Compose)                          │
│  ├─ Screens (全屏 Activity)                   │
│  └─ Overlay (VoiceInteractionSession 悬浮窗)  │
├──────────────────────────────────────────────┤
│  ViewModel Layer                             │
│  ├─ ChatViewModel                            │
│  ├─ HomeViewModel (IoT)                      │
│  ├─ SettingsViewModel                        │
│  └─ OverlayViewModel                         │
├──────────────────────────────────────────────┤
│  Domain Layer                                │
│  ├─ UseCase (SendMessage, ControlIoT, ...)   │
│  └─ Repository Interfaces                    │
├──────────────────────────────────────────────┤
│  Data Layer                                  │
│  ├─ Remote: Retrofit API + WebSocket         │
│  ├─ Local: Room + DataStore                  │
│  └─ Repository Implementation                │
├──────────────────────────────────────────────┤
│  Service Layer                               │
│  ├─ VoiceInteractionService (系统助手)        │
│  ├─ WebSocketService (长连接)                 │
│  └─ FCMMessagingService (推送)               │
└──────────────────────────────────────────────┘
```

UI 层和 Service 层通过 ViewModel 解耦——全屏 Activity 和悬浮窗 Overlay 复用同一组 ViewModel，只是 UI 布局不同。

## 6. 与后端的关系

```
Android Client
  │
  ├─ HTTP REST ──────────► Gateway (:8080)     # 登录、CRUD、配置
  ├─ WebSocket ──────────► Gateway (:8080)     # 实时对话、IoT 状态推送
  ├─ STT Audio ──────────► Voice Service (:8093) # 语音识别
  └─ TTS Stream ◄──────── Voice Service (:8093)  # 语音合成
```

WebSocket 长连接是核心通信通道：对话消息、通知、IoT 状态广播均通过同一连接。HTTP 仅用于一次性操作（登录、文件上传/下载）。

## 7. 关键设计决策

| 决策 | 选择 | 理由 |
|------|------|------|
| UI 框架 | Jetpack Compose + MD3 | 声明式 UI，与悬浮窗的 ComposeView 集成简单 |
| 架构 | MVVM + Repository | Google 官方推荐，ViewModel 可在 Activity 和 Session 间复用 |
| 语音框架 | VoiceInteractionService（系统 API） | 原生支持替换系统助手，无需自定义悬浮窗权限 |
| 热词方案 | 系统 Always-On Hotword API | 息屏低功耗监听，不用自建音频采集 |
| 网络 | OkHttp WebSocket | 比 FCM 更实时，与主项目 Gateway 已有 WS Hub 对应 |
| 最低 API | 26 | 覆盖 95%+ 活跃设备，VoiceInteractionService 兼容 |

## 8. 排期参考

对应主项目路线图：

```
2026 Q4 ─ v1.3   多平台接入（前置依赖）
2027 Q1 ─ v1.8   语音模型训练完成（后端依赖）
2027 Q2 ─ v2.0   开始 Android 客户端开发
2027 Q3 ─ v2.3   语音助手 APP MVP 版本
2027 Q4 ─ v3.0   APP 上架（Google Play / 国内应用商店）
```
