☰
Ely Prism Launcher会话生命周期:从ClaimAccount登录到游戏进程的完整链路
2026/10/17 19:24:44 网站建设 项目流程

【免费下载链接】Launcher

This fork of Prism Launcher adds integrated support for Ely.by accounts.

项目地址:https://gitcode.com/GitHub_Trending/ely/Launcher
点击查看免费下载

Ely Prism Launcher是一个为 Minecraft 打造的开源多实例启动器,它在 Prism Launcher 的基础上深度集成了Ely.by 账号支持。本文带你完整走一遍它的会话生命周期:从一次 Ely.by 账号登录、AuthSession的构建、ClaimAccount锁定账号,到最终java游戏进程被拉起并持续监控的每一步,帮助新手和进阶用户理解启动器内部的完整链路 🚀

一、一次“点击启动”背后的 5 个阶段

Ely Prism Launcher 把启动过程拆成了职责清晰的 5 个阶段,每个阶段都有对应的核心源码文件:

阶段做什么核心文件
① 账号决策选择账号、判定 Normal / Offline / Demo 模式launcher/LaunchController.cpp
② 认证刷新Ely.by OAuth2 登录、获取游戏 Profilelauncher/minecraft/auth/AuthFlow.cpp
③ 会话构建生成AuthSession,标记是否应用 Ely 补丁launcher/minecraft/auth/MinecraftAccount.cpp
④ 启动流水线组装十几步LaunchStep顺序执行(含ClaimAccount)launcher/minecraft/MinecraftInstance.cpp
⑤ 进程拉起用 NewLaunch.jar 启动 Java 进程并跟踪日志launcher/minecraft/launch/LauncherPartLaunch.cpp

下面按链路顺序逐一拆解。

二、登录起点:选账号 + 判定启动模式

一切从 LaunchController::executeTask() 开始。它会先校验 Java 参数是否合法,然后进入login(),执行两个关键决策:

1.decideAccount()—— 用哪个账号?

优先级非常直观:

  1. 实例配置里绑定了专属账号(InstanceAccountId)→ 用它;
  2. 否则使用全局默认账号;
  3. 连一个账号都没有 → 弹窗引导你打开账号管理页添加账号。

2.decideLaunchMode()—— 以什么模式启动?

这一步会检查账号的“健康状况”(AccountState)。如果账号处于Unchecked、Errored、Offline状态或标记了shouldRefresh(),启动器会先触发refresh()刷新令牌,并在进度弹窗中等待刷新完成。根据刷新结果,最终落到三种模式之一:

  • Normal:令牌有效,正常在线游玩;
  • Offline:认证服务器不可达或断网,询问玩家名后离线启动;
  • Demo:账号未购买游戏,询问后以试玩版启动。

💡 如果刷新后账号Expired或Gone,reauthenticateAccount()会弹出“是否重新认证”的提示,让你用新凭据登录。

三、Ely.by 账号登录:一条精简的 4 步认证流

Ely Prism Launcher 的核心特色就在这里。在 AuthFlow 的构造函数中,按账号类型分流:MSA(微软)账号需要 7 步(Microsoft OAuth → Xbox → 权益 → Profile → 皮肤),而Ely.by 账号只需要 4 步,明显更轻:

步骤类作用
1. OAuth 授权ElyStep打开浏览器跳转account.ely.by完成授权,换取 access token
2. 令牌转换ElyYggdrasilTokenStep将 Ely 的 OAuth 令牌直接用作 Yggdrasil(游戏服务端)令牌
3. 获取 ProfileMinecraftProfileStepEly拉取玩家名、UUID 等游戏身份信息
4. 拉取皮肤GetSkinStep预下载皮肤纹理

在无浏览器环境(比如 SSH 远程机器)下,Action::DeviceCode分支会改用 ElyDeviceCodeStep:向account.ely.by申请一个设备码,你在任意设备的浏览器上输入该码即可完成登录,令牌通过轮询/api/oauth2/v1/token拿回。

AuthFlow本身是一个简单的状态机驱动队列:nextStep()逐个弹出步骤执行,任一步骤返回失败状态(如STATE_FAILED_HARD→ 会话过期)就会终止整条流程,并在账号上标记对应的AccountState。

四、AuthSession:贯穿整个会话的“通行证”

登录成功后,账号会调用 MinecraftAccount::fillSession() 生成一个AuthSession对象——它是整个会话生命周期的载体,结构定义在 launcher/minecraft/auth/AuthSession.h:

  • access_token:易失的认证令牌,只存在于本次会话;
  • player_name/uuid:玩家名与 UUID;
  • session:组合会话 ID,写进启动参数;
  • launchMode:本次实际采用的启动模式;
  • wantsElyPatch:Ely 分支特有的标志位,决定是否替换游戏内的认证库。

wantsElyPatch的值由实例设置项ElyPatchPreference决定(0~2 三档策略),例如档位 2 表示“仅 Ely.by 账号时启用补丁”。这个标志会一路传递到启动流水线,触发下一节的 Ely 补丁准备步骤。

五、ClaimAccount:启动流水线中的“账号守卫”

在线模式下,createLaunchTask()组装步骤时会插入ClaimAccount:

if (session->launchMode != LaunchMode::Offline) { process->appendStep(makeShared<ClaimAccount>(pptr, session)); ... }

这段代码位于 MinecraftInstance::createLaunchTask()。它的实现极其克制,却作用关键(见 launcher/minecraft/launch/ClaimAccount.cpp):

  1. executeTask():对即将使用的账号加一把UseLock独占锁。这把锁的意义是——游戏整个运行期间,任何“切换默认账号”“刷新令牌”“登出”等会触碰账号的操作都会被阻塞,保证会话令牌在游戏进程存活期间不会被悄悄作废;
  2. finalize():流水线结束(无论成败)时释放锁,账号重新可操作。

注意ClaimAccount::canAbort()恒返回false——拿锁和放锁是原子性的,中途不能被打断,否则可能留下死锁或令牌竞态。

六、LaunchTask:一条十几步的启动流水线

LaunchTask 是整个启动过程的中枢。executeTask()从第 0 步开始,每步通过start()异步执行,完成后onStepFinished()检查wasSuccessful():成功则推进下一步,失败则回滚调用所有已完成步骤的finalize()并终止(LaunchTask.cpp)。

由 createLaunchTask() 组装出的标准步骤序列如下(📦 为常规步骤,🔑 为 Ely 相关):

#步骤说明
0PrintServers在线模式先检查关键服务器可达性(🔑 Ely 模式检查ely.by/account.ely.by/skinsystem.ely.by,MSA 模式检查微软域名)
1TextPrint打印实例目录、启动模式(online/offline/demo)、启动器版本
2CreateGameFolders创建.minecraft等必备目录
3MinecraftLoadAndCheck加载并校验版本元数据
4AutoInstallJava→CheckJava→VerifyJavaInstall自动装 Java、检查路径与版本满足度
5PreLaunchCommand(可选)执行用户自定义的启动前命令
6🔑ElyPatchTask若wantsElyPatch为真,从元数据索引解析com.mojang:authlib或authlib-injector,把 Ely 认证库注入游戏 classpath(ElyPatchTask.cpp)
7🔑ClaimAccount锁定账号(上节详解)
8LibrariesTask等更新任务下载缺失的游戏库与资源
9ModMinecraftJar→ScanModFolders打包 jar mod、扫描 mods 目录
10EnsureAvailableMemory检查系统内存是否足够,不足则告警
11PrintInstanceInfo打印实例信息(含玩家名等,敏感字段会被脱敏)
12ExtractNatives→ReconstructAssets解压原生库、校验重组资源索引
13LauncherPartLaunch⭐ 真正拉起游戏进程
14PostLaunchCommand(可选)游戏退出后执行后置命令

两个值得了解的设计细节:

  • 日志脱敏:LaunchController会调用setCensorFilter(),把 access token 等敏感串注册进过滤器,censorPrivateInfo()在每一条控制台输出写入 LogModel 前完成替换,避免令牌泄露到日志文件;
  • 两段式推进:LauncherPartLaunch前任务会发出readyForLaunch()进入Waiting状态,若配置了 Profiler(如 JProfiler),启动器会暂停等待用户完成配置后proceed(),否则直接放行。

七、LauncherPartLaunch:脚本 → 命令行 → 游戏进程

最后一步 LauncherPartLaunch 把“一切准备就绪”变成“进程跑起来”:

  1. 选启动器 jar:常规实例使用NewLaunch.jar;老版本或需要在线修复的实例额外挂上NewLaunchLegacy.jar;
  2. 生成启动脚本:instance->createLaunchScript(m_session, m_targetToJoin)将AuthSession(令牌、UUID、会话 ID、目标服务器)渲染成最终命令行;
  3. 环境配置:createLaunchEnvironment()注入-Djava.library.path、classpath,并把进程设为setDetachable(true)—— 即使启动器侧的对象被销毁,游戏进程依然独立存活;
  4. 状态跟踪:LoggedProcess的stateChanged信号驱动成败判定;日志逐行回传LaunchTask,支持解析 log4j XML 结构化日志;
  5. 可选联动:若勾选CloseAfterLaunch,启动器会监听游戏日志中的Setting user行,玩家加载完成后自动关闭所有窗口,让体验接近官方客户端。

游戏进程退出后,LaunchTask::emitSucceeded()会把实例状态setRunning(false),整个会话生命周期至此闭环 🎮

八、常见问题速查

现象原因定位建议
启动卡在 "Updating Yggdrasil token"Ely 令牌步骤阻塞检查account.ely.by网络可达性
提示 "Launcher library could not found"NewLaunch.jar缺失重新安装或修复启动器文件
游戏启动后账号被登出/刷新异常ClaimAccount锁未生效(自定义账号类型)确认账号类型为 Ely/MSA 而非 Offline
断网仍想玩认证服务器不可达会自动降级 Offline 模式,输入玩家名即可
控制台日志出现***脱敏过滤器正常工作属预期行为,令牌已被遮蔽

九、核心文件索引

想深入源码的同学,可以从这几个入口读起:

  • 启动总控:launcher/LaunchController.cpp
  • 流水线编排:launcher/minecraft/MinecraftInstance.cpp(createLaunchTask)
  • 步骤引擎:launcher/launch/LaunchTask.cpp
  • 账号守卫:launcher/minecraft/launch/ClaimAccount.cpp
  • Ely 认证流:launcher/minecraft/auth/AuthFlow.cpp 及 launcher/minecraft/auth/steps/ 目录
  • Ely 补丁注入:launcher/minecraft/update/ElyPatchTask.cpp
  • 进程拉起:launcher/minecraft/launch/LauncherPartLaunch.cpp

小结:Ely Prism Launcher 的会话生命周期是一条“账号决策 → OAuth 认证 → 会话封装 → 流水线准备 → 进程拉起”的单向链路。ClaimAccount看似简单的一步,实则是保证“登录态”与“游戏进程”生命周期严格对齐的守门人——理解了这条链路,你排查任何启动问题都有了地图。

【免费下载链接】Launcher

This fork of Prism Launcher adds integrated support for Ely.by accounts.

项目地址:https://gitcode.com/GitHub_Trending/ely/Launcher
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询