游戏刚下好,点开,黑屏四五秒,退回桌面。再点,还是一样。
机器是 AYN Thor,骁龙 8 Gen 2(Adreno 740)的 ARM 掌机,刷的是社区维护的 Linux 游戏系统 Armada(我用的版本是 20260926)。Windows 游戏靠 Steam 自带的 Proton Experimental (ARM64) 跑,x86 指令再由 FEX 翻成 ARM。游戏是刚上架的《我的世界:地下城 2》(Minecraft Dungeons II,Steam appid 1912410)。
查了几分钟,我的第一个结论是:这台机器上修不了,等官方。 十来分钟后它进了游戏。
先说怎么读这篇:
- 只想照着修:直接看第 3 章,命令可以整段复制
- 登录一直转圈、以为卡死了:看第 4 章
- 想知道「只有 x86 版」为什么不等于 ARM 没戏:看第 2 章,这是全文最值得带走的判据
1. 几秒就退,其实是一个你看不见的弹窗
游戏自己不写日志,退得又快,第一反应是崩溃。但进程列表里游戏进程还活着,截了一张屏,上面挂着一个 Windows 对话框:
Missing Gaming Services — install now?
这款游戏是用微软的 Xbox GDK 打包的(游戏目录里有个 MicrosoftGame.config 就是标志)。它启动前要检查 Windows 上的 Xbox 游戏服务(Gaming Services)。Linux 上当然没有,于是弹窗问你要不要装,你没法装,它就退了。
这事不是掌机独有的。Proton 的 GitHub 上有一个专门的 issue(ValveSoftware/Proton#10193),截至 9 月 30 日已经 345 条回复,Steam Deck、各种 Linux 发行版全中招,issue 仍是打开状态,Valve 员工在里面只做了版务。
2. 我怎么把「修不了」说错的
社区当时的临时办法是两件事:换一个第三方改过的 Proton 版本,再替换游戏里一个叫 XCurl.dll 的网络组件。那些改版 Proton 全是 x86_64 构建的,没有 ARM 版。
我据此下了结论:ARM 掌机用不上,等 Valve。
后来不死心,把那个改版 Proton 的包拆开看,它真正起作用的只是几个 DLL:
- 一个模拟 Xbox 游戏运行时的
xgameruntime.dll,外加一个配套文件xgameruntime.dll.threading - 一个
Microsoft.WindowsAppRuntime.Bootstrap.dll
这些都是 Windows 格式的 DLL(PE 文件),和 Proton 本体用什么芯片编译无关。ARM 上的 Proton 本来就要靠 FEX 跑 x86 的 Windows 游戏,游戏旁边多几个 x86 的 DLL,它照样能跑。
所以根本不用换整个 Proton,把这几个 DLL 塞进游戏自己的 Wine 环境(Proton 给每个游戏单独建的一个「假 C 盘」,叫前缀)就行。
判据就一句:看到「只有 x86 版」,先拆开看修法到底是换宿主程序,还是换 Windows DLL。 前者 ARM 上确实没戏;后者在 ARM 的 Proton 上大概率能直接用。
3. 照着做:AYN Thor + Armada 上的完整步骤
总共动四个文件:游戏目录里换掉一个 XCurl.dll,游戏前缀的 system32 里补三个运行时文件。系统里的 Proton 不换,原文件先备份,随时能回滚。
这套操作我在自己的 Thor 上做过。写成下面这份脚本后,我又在一套模拟的 Steam 目录上从头跑了一遍(下载、解包、四个校验值、备份、替换、回滚),全部通过。
3.0 准备
- Steam 里游戏的兼容性设置保持 Armada 默认的 Proton Experimental (ARM64),不用换。
- 先正常启动一次游戏,让它弹窗退出。这一步是为了让 Proton 把游戏前缀建出来,不然后面要放文件的目录还不存在。
- 打开掌机上的终端(桌面模式里的终端,或者从电脑 SSH 进去都行)。
3.1 下载并核对四个文件
mkdir -p ~/md2fix && cd ~/md2fix
# ① 微软官方 GDK 包(约 135 MB),从里面取 XCurl.dll
curl -L -o gdk.nupkg \
https://api.nuget.org/v3-flatcontainer/microsoft.gdk.pc.230307/10.0.22621.3139/microsoft.gdk.pc.230307.10.0.22621.3139.nupkg
python3 -c "import zipfile; open('XCurl.dll','wb').write(zipfile.ZipFile('gdk.nupkg').read('native/230307/GRDK/ExtensionLibraries/xbox.xcurl.api/redist/commonconfiguration/neutral/XCurl.dll'))"
# ② 社区改版 Proton 的 x86_64 包(约 573 MB),只从里面取三个运行时文件
curl -L -o gdkp.tar.gz \
https://github.com/LukasPAH/GDK-Proton-Custom/releases/download/release-11-7/GDK-Proton11-7-x86_64.tar.gz
W=./GDK-Proton11-7/files/lib/wine/x86_64-windows
tar xzf gdkp.tar.gz --strip-components=6 \
$W/xgameruntime.dll $W/xgameruntime.dll.threading $W/Microsoft.WindowsAppRuntime.Bootstrap.dll
# ③ 核对校验值,四行都要显示「成功」或 OK
sha256sum -c <<'EOF'
c8b83d8810c4dccd55e5a3f6dd9f2ca9e865df2f6eead6db55f7fb9c50066159 XCurl.dll
ac32e6158c45c8a5999e740f1e05489aca9ff204e8d84293682a045c8dedb09f xgameruntime.dll
aa611155057ebd01cf315ad702a4b5725aa9d5e6fad87732c956fe0a1e5fcfba xgameruntime.dll.threading
cd8b961d83a67f5c7a614ba056cd20d2569e9318d6baef4117e254011962cce4 Microsoft.WindowsAppRuntime.Bootstrap.dll
EOF
XCurl.dll 我特意从微软官方 NuGet 包里取,没用社区转发的那份;校验值和社区流传的一致。为什么非得是这个旧版(2023 年 3 月的 GDK 里的那版),我没深究。
3.2 备份,然后放进去
cd ~/md2fix
STEAM=~/.local/share/Steam/steamapps
GAME="$STEAM/common/Minecraft Dungeons II/Dungeons/Binaries/Win64"
SYS32="$STEAM/compatdata/1912410/pfx/drive_c/windows/system32"
# 两个目录都要存在;报「没有那个文件」就回 3.0 第 2 步
ls "$GAME/XCurl.dll" "$SYS32/kernel32.dll"
# 备份原文件
mkdir -p backup
cp -n "$GAME/XCurl.dll" backup/XCurl.dll.orig
for f in xgameruntime.dll xgameruntime.dll.threading Microsoft.WindowsAppRuntime.Bootstrap.dll; do
[ -e "$SYS32/$f" ] && cp -n "$SYS32/$f" backup/
done
# 替换 / 补文件
cp XCurl.dll "$GAME/XCurl.dll"
cp xgameruntime.dll xgameruntime.dll.threading Microsoft.WindowsAppRuntime.Bootstrap.dll "$SYS32/"
3.3 加一个启动参数
在 Steam 里右键游戏 → 属性 → 启动选项,填:
SteamDeck=1 %command%
这是照社区做法加的,我没做「不加会怎样」的对照。我自己是写在 Armada 的单游戏配置 /etc/armada/game-tweaks.json 里(给 1912410 加一个 env),效果一样,但要 sudo,普通读者用 Steam 启动选项更省事。
然后启动游戏。我这边重开后直接进到了首次启动的「辅助功能」设置页。
3.4 回滚
官方修好以后,或者你想恢复原样:
cd ~/md2fix
STEAM=~/.local/share/Steam/steamapps
GAME="$STEAM/common/Minecraft Dungeons II/Dungeons/Binaries/Win64"
SYS32="$STEAM/compatdata/1912410/pfx/drive_c/windows/system32"
cp backup/XCurl.dll.orig "$GAME/XCurl.dll"
for f in xgameruntime.dll xgameruntime.dll.threading Microsoft.WindowsAppRuntime.Bootstrap.dll; do
if [ -e "backup/$f" ]; then cp "backup/$f" "$SYS32/"; else rm -f "$SYS32/$f"; fi
done
再把启动选项里的 SteamDeck=1 删掉。Steam 的「验证游戏文件完整性」也能把 XCurl.dll 换回去。
3.5 其他机器能不能照抄
- 别的 Armada 机器(同为骁龙 8 Gen 2 的掌机):路径一样,理论上能照抄,我没测。
- x86 的 Linux 机器(包括 Steam Deck):这四个本来就是 x86_64 的 Windows DLL,道理上更没障碍,我没测。
- 如果你的 Steam 不装在
~/.local/share/Steam,把STEAM=那行改成你自己的steamapps路径就行。
4. 两个「卡住」,一真一假
4.1 假卡住:它在等一个你看不见的码
设置页过完,画面停在「欢迎 XXX」,一直转圈。
看着像死了。开网络日志抓了一次登录,前面每一步都是通的:
- 用 Steam 身份登录游戏服务器:200
- 读角色和云存档:200
- Xbox 设备认证:200
然后游戏每隔几秒问一次微软「绑好了没」,微软每次回 400。这个 400 的意思是「还没人授权」,属于正常等待。
它在走设备码登录:你应该去手机上打开 microsoft.com/link 输一个 8 位码。问题是这个码在这个环境下不显示在屏幕上,只写在游戏目录的一个文件里。每次启动换一个新码。
读码:
cat ~/.local/share/Steam/steamapps/common/"Minecraft Dungeons II"/Dungeons/Binaries/login.json
里面的 user_code 就是那 8 位码,verification_uri 是要打开的网址。
所以「卡住」的真实意思是:它在等你,而你不知道它在等你。
4.2 真卡住:0063 之后画面冻结
再开一次,弹了「登录失败,错误代码 0063」,只有一个「确定」。按了没反应。
这次是真卡死:连续两秒截图,一个像素都没变,游戏有一个线程一直空转在 97%。只能在 Steam 里强制结束重开。
0063 我没抓到当时的日志,不知道原因。社区里的说法是间歇性的,多重试几次能过。重开以后又能正常走到标题页了。
5. 这些结论哪里还不牢
- 我只验证到登录这一步。 进关卡、实际打一局的帧数和发热,都还没测。
- 微软账号绑定没走完,联机相关的都没验证。
- 有一次游戏无声退出,系统日志里没有内存不足也没有崩溃记录。当时的调试日志被我删了,原因查不到了。教训:游戏还在测试期,日志别删。
- 日志里有 FEX 报的非法指令错误,但进程一直活着,影响未知。
- 三个运行时文件来自第三方项目 GDK-Proton-Custom,其中
.threading是微软原版二进制,经这个项目转发,不是我从微软官方渠道拿的。我核对了文件类型和依赖,没发现异常,但保证不了。另外,Valve 的版务在 Proton#10193 里以「法律上有问题」为由删掉了指向这个改版 Proton 的链接。 这篇只写了去哪取、怎么核对,没有转发任何文件。介意这一点的话,就只能等官方修。 - 远程模拟的虚拟手柄在 Steam 界面里有效,进了游戏完全没反应(截图前后 0 像素变化),游戏里的操作只能人拿着掌机按。掌机自带的实体手柄,游戏能收到输入。
6. 下次遇到「Missing Gaming Services」,按这个顺序
- 先截图,别急着翻崩溃日志。几秒就退的游戏,很多是弹了个窗。
- 游戏目录里有
MicrosoftGame.config,就是 Xbox GDK 游戏,走第 3 章这套。 - 社区修法说「只有 x86 版」,拆开看它换的是宿主程序还是 Windows DLL。是 DLL,ARM 上直接试。
- 原文件先备份,文件从官方渠道取、对校验值,再替换。
- 调试日志只开需要的通道。Proton 默认日志全开,两分钟就涨到 2 GB,大头是异常处理和栈回溯这两个通道。
- 登录转圈别急着强关,去游戏目录找
login.json,里面有绑定码。 - 遇到 0063 先重试两三次,还不行就走离线模式玩单机。
就这么多。一开始说「等官方修吧」的那个我,十来分钟后在读 login.json 里的绑定码。