# SlayTheAmethyst 系统架构设计图集
面向对象:技术评审、架构汇报、实现对齐。
本文档不是“仓库目录图”,而是按系统分析与设计中的常见正式视图来组织:
- 系统上下文图
- 容器图
- 部署与进程图
- 运行时装配图
- 关键启动时序图
- 应用内部组件图
当前图集以 `C4` 的组织方式为主,并补充本项目必须单独表达的 Android 多进程、JVM 运行时装配与启动时序视图。
## 1. 架构范围与边界
系统范围定义如下:
- 主系统:`SlayTheAmethyst` Android 启动器
- 目标运行对象:模组版 `Slay the Spire`
- 运行方式:Android 应用负责准备运行时、修补桌面 Jar、组装类路径,并在嵌入式 Java 运行时中启动桌面版游戏与模组
- 系统外部依赖:Steam 生态、反馈中继服务、Presence 服务、GitHub 资产与更新分发、邮件通知与镜像资源
## 2. 架构驱动因素
本系统的核心架构驱动因素不是普通移动 App 的页面组织,而是以下几项:
1. Android 上托管桌面 Java 游戏与桌面模组运行时。
2. 在不破坏桌面模组生态的前提下做兼容修补、输入适配和性能缓解。
3. 将大量桌面侧运行时组件作为 APK 内资产交付,并在设备端动态安装和组装。
4. 将游戏进程、诊断、日志抓取、Steam Cloud 同步等职责分离到不同 Android 进程。
5. 将 Workshop、反馈、Presence、更新、Steam Cloud 等外围能力集成进同一启动器。
## 3. 视图一:系统上下文图
这张图回答“系统和谁交互、边界在哪里”。
```mermaid
flowchart LR
User["玩家"]:::actor
Maintainer["维护者 / 问题处理者"]:::actor
App["SlayTheAmethyst Android 启动器"]:::system
Steam["Steam 服务生态
认证 / Workshop / CDN / Steam Cloud"]:::external
Presence["Presence Service
Fastify + WebSocket + SQLite"]:::external
FeedbackRelay["Feedback Relay
Tencent SCF / Express"]:::external
GitHubIssues["GitHub Issues 仓库"]:::external
GitHubAssets["GitHub Diagnostics / Release Assets"]:::external
UpdateSources["GitHub Releases / 镜像 / 原生库资源市场"]:::external
Mail["SMTP 邮件服务"]:::external
PresencePanel["在线状态面板"]:::external
User --> App
App --> Steam
App --> Presence
App --> FeedbackRelay
App --> UpdateSources
FeedbackRelay --> GitHubIssues
FeedbackRelay --> GitHubAssets
FeedbackRelay --> Mail
Maintainer --> GitHubIssues
Maintainer --> PresencePanel
PresencePanel --> Presence
classDef actor fill:#fff7e6,stroke:#c98a00,color:#222;
classDef system fill:#e8f1ff,stroke:#2b6cb0,color:#102a43;
classDef external fill:#f7fafc,stroke:#718096,color:#1a202c;
```
### 上下文说明
- 玩家通过 Android 启动器完成启动、模组管理、Workshop 浏览下载、Steam Cloud 登录与同步、反馈提交。
- 启动器直接与 Steam 相关服务交互,用于 Workshop 内容访问与 Steam Cloud 相关能力。
- Presence 已迁移到独立的 `online-service`,通过 WebSocket 上报状态并提供面板。
- 反馈链路使用独立的 `cloud-function` 中继,再写入 GitHub Issues 和诊断资产仓库。
- 更新与外部资源获取依赖 GitHub Releases、镜像与原生库资源市场。
## 4. 视图二:系统容器图
这张图回答“系统由哪些主要可部署/可演化单元组成,它们如何协作”。
```mermaid
flowchart LR
subgraph Mobile["移动端系统边界"]
App["Android App
Launcher UI + 启动编排 + 外围业务"]:::container
Runtime["Device Runtime Environment
嵌入式 JRE + 桌面游戏 Jar + ModTheSpire + 兼容补丁"]:::container
end
subgraph Cloud["云侧与外部平台"]
Presence["online-service
状态上报与面板推送"]:::container
FeedbackRelay["cloud-function
反馈与诊断中继"]:::container
Steam["Steam 平台
Workshop / CDN / Steam Cloud"]:::external
GitHubIssues["GitHub Issues"]:::external
GitHubAssets["GitHub Diagnostics / Release Assets"]:::external
UpdateSources["GitHub Releases / Mirrors / Resource Market"]:::external
Mail["SMTP"]:::external
end
App -->|"本地文件 / 进程控制 / 参数组装"| Runtime
App -->|"WebSocket / HTTPS"| Presence
App -->|"HTTPS multipart / JSON"| FeedbackRelay
App -->|"HTTPS / 协议客户端"| Steam
App -->|"HTTPS 下载与版本检查"| UpdateSources
FeedbackRelay -->|"GitHub App / Token"| GitHubIssues
FeedbackRelay -->|"Release Assets"| GitHubAssets
FeedbackRelay -->|"SMTP"| Mail
classDef container fill:#edf2f7,stroke:#4a5568,color:#1a202c;
classDef external fill:#f7fafc,stroke:#718096,color:#1a202c;
```
### 容器职责说明
| 容器 | 职责 |
| --- | --- |
| `Android App` | 提供 UI、配置、启动准备、模组导入、Workshop、反馈、Presence、更新、Steam Cloud 等能力 |
| `Device Runtime Environment` | 在设备端承载嵌入式 Java 运行时、Boot Bridge、ModTheSpire、patched `desktop-1.0.jar`、兼容补丁与附加 Mod |
| `online-service` | 接收在线状态 WebSocket,上报与推送面板统计 |
| `cloud-function` | 反馈包上传、Issue 创建/同步、诊断资产持久化、邮件通知 |
## 5. 视图三:Android 部署与进程图
这张图回答“移动端落地后,职责如何在 Android 进程与本地存储上展开”。
```mermaid
flowchart TB
subgraph Device["Android Device"]
subgraph P0["默认应用进程"]
Launcher["LauncherActivity / Compose UI"]:::proc
AppServices["启动准备
Workshop / Feedback / Presence / Update"]:::proc
end
subgraph P1[":game 进程"]
GameActivity["StsGameActivity"]:::proc
Session["GameSessionCoordinator"]:::proc
Jvm["JvmLaunchController / VMLauncher / JNI"]:::proc
end
subgraph P2[":diag 进程"]
Diag["DiagnosticsProcessService"]:::proc
end
subgraph P3[":logcat 进程"]
Logcat["LogcatCaptureService
LauncherLogcatCaptureService"]:::proc
end
subgraph P4[":steamcloud 进程"]
SteamCloud["SteamCloudSyncProcessService"]:::proc
end
subgraph Storage["设备端存储"]
Internal["app files/
files/runtimes/Internal"]:::store
StsRoot["sts 运行目录
externalFilesDir(...)/sts 或 files/sts"]:::store
end
end
Launcher --> AppServices
AppServices --> GameActivity
GameActivity --> Session
Session --> Jvm
AppServices --> Diag
AppServices --> Logcat
AppServices --> SteamCloud
AppServices --> Internal
AppServices --> StsRoot
Jvm --> Internal
Jvm --> StsRoot
Diag --> StsRoot
Logcat --> StsRoot
SteamCloud --> StsRoot
classDef proc fill:#e6fffa,stroke:#2c7a7b,color:#1d4044;
classDef store fill:#fffaf0,stroke:#b7791f,color:#4a2c00;
```
### 进程设计说明
- 默认进程承担 UI、启动准备与大部分外围业务。
- `:game` 进程专门承载渲染 Surface、JVM 启动与游戏运行。
- `:diag` 进程隔离日志归档与诊断打包,降低对主 UI 与游戏进程的干扰。
- `:logcat` 进程隔离日志抓取。
- `:steamcloud` 进程隔离较重的同步流程。
这种拆分体现的是“运行时托管系统”而不是普通单进程移动 App。
## 6. 视图四:运行时装配图
这张图回答“桌面运行时是如何从仓库模块装配到 APK,再装到设备端运行目录中的”。
```mermaid
flowchart LR
subgraph Source["源码与构建产物"]
BootBridge[":boot-bridge"]:::build
Agent[":agent-connector"]:::build
GdxPatch[":patches:gdx-patch"]:::build
RuntimeCompat[":mods:amethyst-runtime-compat"]:::build
FloatingTools[":mods:amethyst-floating-tools"]:::build
RamSaver[":mods:ram-saver"]:::build
RuntimePack["runtime-pack/jre8-pojav.zip"]:::build
end
subgraph BuildLogic["Gradle Build Logic"]
Assets["generated runtime assets
components/boot_bridge
components/agent_connector
components/gdx_patch
components/mods"]:::build
Apk["APK / App Bundle"]:::build
end
subgraph Device["设备端运行时"]
Files["files/runtimes/Internal"]:::runtime
Sts["stsRoot
desktop-1.0.jar / ModTheSpire.jar / mods / logs"]:::runtime
JvmProcess["运行中的桌面 JVM"]:::runtime
end
BootBridge --> Assets
Agent --> Assets
GdxPatch --> Assets
RuntimeCompat --> Assets
FloatingTools --> Assets
RamSaver --> Assets
RuntimePack --> Apk
Assets --> Apk
Apk --> Files
Apk --> Sts
Files --> JvmProcess
Sts --> JvmProcess
classDef build fill:#ebf8ff,stroke:#3182ce,color:#1a365d;
classDef runtime fill:#f0fff4,stroke:#38a169,color:#1c4532;
```
### 装配设计说明
- `:app` 不是直接“链接”这些桌面组件,而是在构建期把它们打包进运行时资产。
- 设备端启动前由安装/准备逻辑将运行时包、JAR、补丁和 Mod 落到本地运行目录。
- 启动时真正运行的是设备上的桌面 JVM 进程,而不是 Android ART 内的一组普通业务对象。
这部分是本系统和普通 Android App 最大的结构性差异。
## 7. 视图五:关键启动时序图
这张图回答“从玩家点击启动到游戏进入桌面 JVM 的关键时序是什么”。
```mermaid
sequenceDiagram
actor User as 玩家
participant Launcher as LauncherActivity / UI
participant Prep as MainProcessLaunchPreparationCoordinator
participant Install as ComponentInstaller / RuntimePackInstaller
participant Patch as ModJarSupport / MTS Warmup
participant Game as StsGameActivity (:game)
participant JVM as JvmLaunchController / VMLauncher
participant Bridge as BootBridgeLauncher
participant Delegate as MTS Loader 或 DesktopLauncher
participant Diag as DiagnosticsProcessService (:diag)
User->>Launcher: 点击启动
Launcher->>Prep: prepareBeforeLaunch()
Prep->>Install: 安装组件与运行时
Install-->>Prep: boot-bridge / agent / patch jars / bundled mods ready
Prep->>Patch: 校验 Jar、组装类路径、缓存预热、启动前补丁
Patch-->>Prep: launch spec ready
Prep-->>Launcher: 准备成功
Launcher->>Game: 启动 StsGameActivity
Game->>Game: 等待 Surface 与尺寸就绪
Game->>JVM: startJvmOnce()
JVM->>Bridge: 启动 BootBridgeLauncher
Bridge->>Delegate: 委托给 MTS Loader 或 DesktopLauncher
Delegate-->>Bridge: 输出 phase / splash / ready / fail 事件
Delegate-->>Game: 返回退出码 / 运行结果
Game->>Diag: 请求日志归档与诊断包构建
Diag-->>Launcher: 返回诊断结果
```
### 时序设计说明
- 启动准备在默认进程先完成,成功后才进入 `:game`。
- `BootBridgeLauncher` 是 JVM 入口桥,真正业务入口再委托给 `MTS Loader` 或原版 `DesktopLauncher`。
- 启动事件既是进度渠道,也是故障诊断渠道。
## 8. 视图六:`:app` 内部组件图
这张图回答“Android 主应用内部的主要职责如何分层”。
```mermaid
flowchart TB
subgraph Presentation["表现层"]
UI["LauncherActivity / Compose Screens
workshop / feedback / settings / main"]:::layer
end
subgraph Application["应用服务层"]
Launch["Launch Orchestration
backend.launch"]:::layer
Workshop["Workshop Service Layer
backend.workshop"]:::layer
SteamCloud["Steam Cloud Service Layer
backend.steamcloud"]:::layer
Feedback["Feedback Service Layer
backend.feedback"]:::layer
Presence["Presence Service Layer
backend.presence"]:::layer
Update["Update & Resource Layer
backend.update / backend.nativelib"]:::layer
end
subgraph RuntimeSupport["运行时支撑层"]
Mods["Mod Management / Import / Patch
backend.mods"]:::layer
Runtime["Runtime Install / Resource Paths
backend.runtime / backend.resources"]:::layer
Render["Render / Display / Audio / Bridge
backend.render / backend.audio / backend.bridge"]:::layer
Diag["Diagnostics / Crash / Log Export
backend.diag / backend.crash"]:::layer
Infra["File / Network / Process / Steam Helpers"]:::layer
end
subgraph SharedLibs["共享库"]
WorkshopCore["project(:workshop-core)"]:::lib
SteamProtocol["project(:steam-protocol)"]:::lib
end
UI --> Launch
UI --> Workshop
UI --> SteamCloud
UI --> Feedback
UI --> Update
Launch --> Mods
Launch --> Runtime
Launch --> Render
Launch --> Diag
Workshop --> WorkshopCore
WorkshopCore --> SteamProtocol
SteamCloud --> Infra
Feedback --> Diag
Presence --> Infra
Update --> Infra
classDef layer fill:#faf5ff,stroke:#6b46c1,color:#2d1b69;
classDef lib fill:#fff5f5,stroke:#c53030,color:#63171b;
```
### 分层设计说明
- 表现层负责交互,不直接承载桌面运行时控制细节。
- `backend.launch` 是启动编排核心,协调安装、校验、补丁、类路径与真正启动。
- `backend.mods` 是本项目最关键的特有子系统之一,承担 Mod 校验、导入、兼容补丁与类路径装配。
- `workshop-core` 与 `steam-protocol` 从主 App 中抽出,形成更清晰的协议/下载栈边界。
## 9. 汇报建议
如果要给技术人员做正式汇报,不建议只展示一张总图。推荐用下面的顺序:
1. 先讲“系统上下文图”,说明系统边界和外部依赖。
2. 再讲“容器图”,说明移动端、设备运行时、云侧服务的职责拆分。
3. 再讲“Android 部署与进程图”,突出本项目的多进程设计。
4. 再讲“运行时装配图”,突出本项目不是普通 App,而是桌面 JVM 托管系统。
5. 最后讲“关键启动时序图”和“内部组件图”,解释启动路径与实现组织。
## 10. 本文档的实现依据
以下实现证据已在当前仓库中核对:
- `settings.gradle.kts`
- `app/src/main/AndroidManifest.xml`
- `app/build.gradle.kts`
- `gradle/build-logic/src/main/kotlin/StsAndroidAppBuildPlugin.kt`
- `docs/backend-startup-chain.md`
- `online-service/README.md`
- `cloud-function/README.md`
- `cloudflare-presence-worker/README.md`
- `agent-connector/README.md`
- `mods/amethyst-runtime-compat/README.md`
## 11. 下一层深化建议
如果后续要继续升到“更细设计评审”级别,建议再补以下专题:
1. `Steam Cloud` 专题图,专门讲登录、鉴权、manifest、diff、pull/push 与本地快照。
2. `Launch / Mod Assembly` 专题图,专门讲 `backend.launch` 与 `backend.mods` 的装配边界。
3. `Observability` 专题图,专门讲 `boot_bridge_events.log`、`latest.log`、`logcat`、crash bundle 与性能审计日志之间的关系。
这三张会比继续扩大总图更有价值,也更适合深入技术评审。
## 12. 附录专题图与汇报顺序
为了把主报告整理成可直接讲述的材料,附加了以下文档:
- [架构汇报顺序建议](./architecture/presentation-flow.md)
- [Workshop 与 Steam 协议栈专题](./architecture/workshop-steam-architecture.md)
- [反馈、诊断与 GitHub 链路专题](./architecture/feedback-diagnostics-architecture.md)
- [Runtime Compat 补丁域专题](./architecture/runtime-compat-architecture.md)