在我们开始之前
星云启动器是 Windows 上的 Minecraft Java 版启动器。这份知识库讲它是怎么做的——如果你想自己实现一个启动器,或者想给现有的启动器加功能,这里是内部实现的全貌。
这份知识库是怎么写的
这份知识库的体量不小,从装游戏、起进程到插件、AI 助手、界面都要讲到,所以采用了人工搭建框架 + AI 细化成文的方式撰写:章节怎么划分、讲哪些结论、哪些是真正踩过的坑,由人工确定并逐篇校对;具体的行文表述,由 AI 在既定框架内展开细化。
它面向的是想学习启动器实现的其他第三方开发者,目的是把可复用的做法和教训讲清楚,而不是堆砌内部资料。内容对应桌面端 0.3.9,实现会随版本演进,请用文件名 + 类型/方法名定位,不要依赖行号。
运行环境要求
星云桌面端要求:
- Windows 10 1809(build 17763)或更高 / Windows 11,x64
- .NET 运行时 8.0 以上
不是 32 位
Windows 上的启动器从立项起就放弃了 32 位系统。这不是偷懒——游戏本身在高内存场景下会吃满 3GB 以上,32 位地址空间下 JVM 和启动器加起来很容易撞上限。
装好的机器上有什么
装完之后,磁盘上会多出两处东西。
启动器自己的数据在 %APPDATA%/starcloud-launcher/:
launcher.settings.json 全局设置
accounts.json 账户身份信息
microsoft.tokens.json 正版登录的 refresh_token(DPAPI 加密)
starcloud-id.json 星云 ID 会话
cache/ 资源缓存、图标、皮肤缩略图
library/ 统一内容库
java/8、java/17、java/21/ 下载的 JDK
skins/ 皮肤库
plugins/ 插件
logs/ 启动器日志游戏数据在 .minecraft/(可以在设置里改):
versions/<版本号>/ 每个版本一个目录
libraries/ 依赖库
assets/ 材质与音频
mods/ saves/ config/ ... 内容目录
starcloud/ 启动器放在游戏目录里的状态一个容易踩的坑:版本目录名 ≠ 版本号
装了同一个版本的第二份之后,目录会长这样:
versions/
├── 1.20.1/ ← 原版
│ ├── 1.20.1.json
│ └── 1.20.1.jar
├── 1.20.1-2/ ← 你复制出来的第二份
│ ├── 1.20.1.json ← 注意:里面写的 id 还是 1.20.1
│ └── 1.20.1.jar
└── 1.21/ ← 原版目录名是 1.20.1-2,但 JSON 里的 id 还是 1.20.1。
启动器启动实例时用的是目录名,不是 JSON 里的 id。这两个搞混了会去找 versions/1.20.1/1.20.1.jar——那正好是第一份的 jar,于是你以为在启动第二份,其实启动的是第一份;再或者两份互相覆盖,jar 直接丢。
实现细节见版本管理。
关于令牌
微软账号和第三方账号的 access token 只存在内存里,应用一关就没了。
这不是偷懒,是合规要求:token 等同于你的账号密码,落盘就意味着任何能读你磁盘的 程序都能拿去登你的号。
代价是每次重启启动器后,第一次启动游戏需要重新登录一次。refresh_token 是个例外——它用 Windows DPAPI 加密后落盘,有效期 30 天,但只在 Windows 上有效。
非 Windows 环境下这份文件是 Base64 编码,不是加密。如果你要把数据目录放到共享盘或者别的系统上,注意这一点。