Skip to content

在我们开始之前 ​

星云启动器是 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 编码,不是加密。如果你要把数据目录放到共享盘或者别的系统上,注意这一点。

接下来 ​

基于 MIT 许可证(有修改)开源