# SlayTheAmethyst 架构总览 这份文档的目标不是替代实现细节文档,而是给出一份可以跟代码一起维护、可直接渲染、可继续细化的仓库级架构图。 正式汇报版图集见:[system-architecture-report.md](./system-architecture-report.md)。 ## 推荐绘图工具 首选 `Mermaid`。 原因: - 纯文本,可直接由 Codex 生成和持续更新。 - GitHub / Markdown / Codex 都能直接渲染,不需要额外二进制源文件。 - 非常适合和当前仓库一起做版本管理、Code Review、差异比较。 - 后续如果你还要做展示版,可以再从 Mermaid 转到 draw.io / Excalidraw / Figma 做视觉润色。 如果你的目标是“先把正确架构画出来,而且后面还要持续随代码更新”,这个仓库最适合先用 Mermaid 落地。 ## 1. 仓库模块架构 ```mermaid flowchart LR subgraph Repo["SlayTheAmethyst 多模块仓库"] App[":app
Android 启动器主应用"] WorkshopCore[":workshop-core
Workshop 下载核心"] SteamProtocol[":steam-protocol
Steam 协议与客户端"] BootBridge[":boot-bridge
JVM 启动桥接入口"] AgentConnector[":agent-connector
运行时 Java Agent"] GdxPatch[":patches:gdx-patch
桌面兼容补丁 Jar"] RuntimeCompat[":mods:amethyst-runtime-compat
运行时兼容补丁 Mod"] FloatingTools[":mods:amethyst-floating-tools
运行时悬浮工具 Mod"] RamSaver[":mods:ram-saver
内存优化 Mod"] Macrobenchmark[":macrobenchmark
App 性能基准"] SteamCloudSpike[":tools:steam-cloud-spike
Steam Cloud 验证工具"] end App --> WorkshopCore App --> SteamProtocol WorkshopCore --> SteamProtocol SteamCloudSpike --> SteamProtocol Macrobenchmark -. 目标应用 .-> App App -. 构建时打包到运行时资产 .-> BootBridge App -. 构建时打包到运行时资产 .-> AgentConnector App -. 构建时打包到运行时资产 .-> GdxPatch App -. 构建时打包到运行时资产 .-> RuntimeCompat App -. 构建时打包到运行时资产 .-> FloatingTools App -. 构建时打包到运行时资产 .-> RamSaver ``` ### 模块职责摘要 | 模块 | 主要职责 | | --- | --- | | `:app` | Android 启动器 UI、启动编排、资源安装、模组管理、Workshop、Steam Cloud、反馈、Presence、更新 | | `:workshop-core` | 下载 Steam Workshop 内容所需的下载器、分块处理、校验与输出路径管理 | | `:steam-protocol` | Steam 目录/认证/内容/Published File 的协议层客户端 | | `:boot-bridge` | JVM 进程实际入口,负责把启动阶段状态桥接回 Android 侧 | | `:agent-connector` | 通过 `-javaagent` 注入运行中的游戏 JVM,向外暴露调试/监控协议 | | `:patches:gdx-patch` | 通过补丁类修正桌面 LibGDX / SteamInput / Shader 等兼容性问题 | | `mods/*` | 以 ModTheSpire Patch 形式交付的运行时修复、触屏适配、调试能力、内存优化 | | `:macrobenchmark` | 面向 `:app` 的 Android Macrobenchmark 性能测试 | | `:tools:steam-cloud-spike` | 独立验证 Steam Cloud 链路,不属于 APK 运行时主路径 | ## 2. `:app` 内部分层 ```mermaid flowchart TB subgraph UI["UI / 交互层"] MainUI["ui.main / LauncherActivity / LauncherContent"] SettingsUI["ui.settings / ui.preferences"] WorkshopUI["ui.workshop"] FeedbackUI["ui.feedback"] end subgraph Orchestration["启动与运行编排层"] Launch["backend.launch"] Render["backend.render"] Runtime["backend.runtime"] Resources["backend.resources"] Process["backend.process / backend.bridge / backend.audio"] end subgraph Domain["业务子系统层"] Mods["backend.mods"] Workshop["backend.workshop"] SteamCloud["backend.steamcloud"] Feedback["backend.feedback"] Presence["backend.presence"] Update["backend.update / backend.github / backend.nativelib"] end subgraph Platform["平台与支撑层"] Diag["backend.diag / backend.crash"] Files["backend.file_interactive / backend.fs"] Steam["backend.steam"] Network["backend.network"] end subgraph RuntimeAssets["运行时资产"] DesktopJar["desktop-1.0.jar"] RuntimePack["runtime-pack / files/runtimes/Internal"] BootBridgeJar["boot-bridge.jar"] AgentJar["agent-connector.jar"] RuntimeMods["MTS Mods / enabled_mods.txt / mods/*.jar"] PatchJar["gdx-patch.jar"] end MainUI --> Launch SettingsUI --> Launch WorkshopUI --> Workshop FeedbackUI --> Feedback Launch --> Mods Launch --> Runtime Launch --> Resources Launch --> Render Launch --> Process Workshop --> WorkshopCoreLib["project(:workshop-core)"] WorkshopCoreLib --> SteamProtocolLib["project(:steam-protocol)"] SteamCloud --> Steam Feedback --> Diag Presence --> Network Update --> Network Launch --> DesktopJar Launch --> RuntimePack Launch --> BootBridgeJar Launch --> AgentJar Launch --> RuntimeMods Launch --> PatchJar ``` ## 3. 启动与运行时链路 详细说明见 [backend-startup-chain.md](./backend-startup-chain.md)。下面这张图是主干路径的压缩版。 ```mermaid sequenceDiagram actor User as 用户 participant Launcher as LauncherActivity / Compose UI
(默认进程) participant Prep as MainProcessLaunchPreparationCoordinator participant Game as StsGameActivity
(:game 进程) participant JVM as JvmLaunchController + VMLauncher participant Bridge as BootBridgeLauncher participant Entry as MTS Loader / DesktopLauncher participant Diag as DiagnosticsProcessService
(:diag 进程) User->>Launcher: 点击启动 Launcher->>Prep: prepareBeforeLaunch(...) Prep->>Prep: 安装组件与运行时 Prep->>Prep: 校验 / 修补 desktop-1.0.jar Prep->>Prep: 解析 mods 与 classpath Prep->>Prep: 预热缓存 / 启动前补丁 Prep-->>Launcher: 准备完成 Launcher->>Game: 启动 StsGameActivity Game->>Game: 等待渲染 Surface 就绪 Game->>JVM: startJvmOnce() JVM->>Bridge: 启动 io.stamethyst.bridge.BootBridgeLauncher Bridge->>Entry: 委托给 MTS Loader 或 DesktopLauncher Entry-->>Bridge: 写入 READY / FAIL / phase 事件 Entry-->>Game: 游戏运行 / 退出码 Game->>Diag: 打包日志 / 崩溃 / 诊断归档 Diag-->>Launcher: 返回诊断结果 ``` ### 运行时关键产物 - `sts/desktop-1.0.jar` - `sts/ModTheSpire.jar` - `sts/mods/*.jar` - `sts/enabled_mods.txt` - `sts/latest.log` - `sts/jvm_logs/jvm_log_*.log` - `sts/boot_bridge_events.log` - `files/runtimes/Internal/...` ## 4. 外部系统集成架构 ```mermaid flowchart LR subgraph App["Android 启动器 :app"] WorkshopFeature["Workshop UI + backend.workshop"] SteamCloudFeature["backend.steamcloud"] FeedbackFeature["backend.feedback"] PresenceFeature["backend.presence"] UpdateFeature["backend.update / backend.nativelib"] end WorkshopFeature --> WorkshopCore["workshop-core"] WorkshopCore --> SteamProtocol["steam-protocol"] SteamProtocol --> SteamWorkshop["Steam CM / CDN / Published File API"] SteamCloudFeature --> SteamCloudBackend["Steam 登录 / Steam Cloud 存档服务"] FeedbackFeature --> CloudFunction["cloud-function
Tencent SCF 反馈中继"] CloudFunction --> GitHubIssues["GitHub Issues"] CloudFunction --> DiagnosticsRepo["GitHub Release 诊断资产仓库"] CloudFunction --> Mail["SMTP 邮件通知"] PresenceFeature --> PresenceService["online-service
Fastify + WebSocket + SQLite"] UpdateFeature --> GitHubReleases["GitHub Releases / Mirror / 资源市场"] LegacyScf["旧版 SCF presence relay"]:::legacy LegacyWorker["cloudflare-presence-worker
Legacy D1 presence storage"]:::legacy LegacyScf -. 已废弃的旧 presence 链路 .-> LegacyWorker classDef legacy fill:#f5f5f5,stroke:#999,color:#444,stroke-dasharray: 5 5; ``` ## 当前应当如何继续细化 如果你要把它画成“最终版正确架构图”,建议按下面顺序继续拆: 1. `:app` 再拆成一张“启动/运行时”子图。 2. `:app` 再拆成一张“Workshop + Steam 协议栈”子图。 3. `:app` 再拆成一张“反馈/诊断/Issue 同步”子图。 4. `mods:amethyst-runtime-compat` 单独出一张“运行时补丁域模型图”。 这样能保证每张图都正确、清晰,而且不会把仓库模块、运行时进程、外部服务三种不同视角混在一起。