RPCS3 自动更新机制详解:3 行门槛逻辑决定你是否会看到更新提示
【免费下载链接】rpcs3PlayStation 3 emulator and debugger项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3
本文沿 RPCS3 自动更新 的真实调用链,从触发时机、版本检测、包校验讲到分平台安装,并给出配置查哪里、坏了查哪条日志。读完能回答一个问题:为什么你的机器会自动更新,而别人的从来只弹"已是最新"。
自动检查到底从哪里开始
自动触发点只有一个:主窗口show()。窗口第一次显示时最多执行一次,行为由 gui_settings.h 中Meta组的checkUpdateStart一项决定(即设置对话框里的"是否检查更新"下拉框):
if (update_value != gui::update_off) { const bool in_background = m_with_cli_boot || update_value == gui::update_bkg; const bool auto_accept = !in_background && update_value == gui::update_auto; m_updater.check_for_updates(true, in_background, auto_accept, this); }四个选项对应四种可验证的行为:
- 在设置里选"Yes",启动检查完直接弹版本对比对话框,预期结果:每次都要你手动点确认
- 选"Background",启动检查完成后仅在有更新时发通知,预期结果:进度窗不挡游戏列表
- 选"Automatic",发现更新直接走下载安装,预期结果:全程不询问,但安装前仍要求模拟已停止
- 选"No",完全跳过自动检查,预期结果:只能靠 File 菜单的"Check for Updates"手动触发
两个补充条件:
- 用命令行参数直接启动游戏时,本次检查被强制转为后台模式,预期结果:启动流程不被弹窗卡住
- 手动触发(main_window.cpp 中的菜单项
updateAct)传automatic=false,下一节讲的限制对它不生效,预期结果:本地构建也能点菜单拿到更新
为什么有的机器会静默跳过检查
这是 RPCS3 自动更新 里"有人弹提示、有人永远不弹"的最直接原因。check_for_updates内,自动检查要过两道硬门槛,命中即返回,并在UPDATER日志通道留下一行:
if (!allow_local_auto_update && rpcs3::is_local_build()) { update_log.notice("Skipped automatic update check: this is a local build"); return; } #ifdef __linux__ if (!::getenv("APPIMAGE")) return; // 非 AppImage 启动,跳过 #endif判断依据有两处:
- 构建的 git 分支恰为
local_build,该标志在编译期就烙进二进制(见 rpcs3_version.cpp)。设计意图是避免官方发行版覆盖开发分支的工作现场,所以allow_local_auto_update是恒为 false 的常量,想测更新必须改源码重编 - Linux 上只有 AppImage 方式启动才会设置
APPIMAGE环境变量,源码编译或包管理器安装都没有,预期结果:自动更新被跳过,只剩手动检查可用
想确认自己命中哪道门槛:在日志里搜Skipped automatic update check,冒号后的一句话就是原因,不用再看别的。
版本比对请求长什么样,结果如何判定
过了门槛后,更新器用当前 commit、os_type、os_arch、os_version 四个参数拼出查询请求。update_manager.cpp 的handle_json按固定顺序做三段判定:
- 先看
return_code:负值表示异常态。-1意为"查不到当前 commit"(自定义/PR 构建),只记警告;-2是服务端维护,-3是非法查询,其余负值按未知服务器错误记录 - 再校验
latest_build节点完整性:download、size、checksum、version、datetime每项都要存在且类型正确,缺一项就记录具体节点名并中止 - 最后校验下载地址必须指向 RPCS3 官方发布库,否则记 fatal 中止——这一行是防更新通道被篡改的 JSON 劫持
三种正常状态怎么从日志里认出来
- 日志出现 "RPCS3 is up to date!" 且自动检查无弹窗,预期结果:版本已最新,这不是故障
- 弹窗提示存在"更好的版本"并建议降级:服务端最新时间戳早于当前,通常说明当前版本被标记为坏版本,这种提示不要忽略
- 弹窗显示 "You're currently using a custom or PR build":走了
-1分支,手动检查会询问是否切换,自动检查则不弹
跳过版本号写在哪里
版本对比对话框里的 "Don't show again for this version" 复选框,勾选并点 No 后,新版本字符串会被写入 gui_settings.h 的infoBoxSkipVersion项。此后的每次自动检查先拿它和新版本号比对,相等就静默关掉进度窗并记录 "Skipping automatic update notification"。
- 跳过记录只对自动检查生效,手动点菜单永远会问,预期结果:测试通道可以反复验证任意版本
- 记录的是版本号而非"此后全部",官方发一个新版本号后提示自动恢复
- 想清除记录:删掉 GUI 配置文件
main_window组里的对应项,预期结果:下次启动提示恢复
安装阶段三个平台各换哪种文件
安装启动前的两道硬条件
- 更新器先检查
Emu.IsStopped(),模拟在跑就直接中止并提示"请先停止当前游戏",预期结果:不会在进程占用文件时动安装目录 - 再比对大小(实际值对服务端声明值)并计算 SHA256 与 JSON 里的
checksum比对,任一不匹配就拒绝安装,预期结果:磁盘上一个文件都不会被改动
三个平台的换文件方式
- Linux AppImage:旧文件改名为
<原文件名>_old,新包写回原路径、恢复可执行权限,用execv带--updating参数换进程,预期结果:下次启动即新版,旧文件留在原地可回退 - Windows:7z 包先写临时目录再逐条目解压到安装目录,遇到被锁定的文件先改名到
rpcs3_old/子目录再覆盖,完成后用_wexecl重启,预期结果:多数文件锁不阻断更新 - macOS:解压到临时目录,由应用 Resources 里自带的
update_helper.sh完成 .app 替换与重启动,预期结果:应用路径保持不变
安装成功后,RPCS3 自动更新 流程会留下两份凭证:配置目录的update_history.log追加一行带时间戳的 "Updated from X to Y",日志通道记录 "Update successful!"。排错时先找这两处。
⚠️ 排错:三类常见故障怎么判定
按"症状 → 日志关键字 → 判定依据"的顺序查,不要跳步。
故障一:从不弹通知,怀疑坏了
- 第一步在日志搜
Skipped automatic update check:搜到即原因已写明(本地构建或非 AppImage),排查结束 - 第二步确认 GUI 配置里
checkUpdateStart是否被设成了 "No",是的话改回其他选项,下次启动恢复检查 - 第三步看日志有无检查记录但无弹窗:搜 "Skipping automatic update notification",命中即被版本跳过记录拦下,按上一节清除即可
故障二:手动点检查立刻报错
- 第一步看
UPDATER日志的错误内容:Invalid JSON说明响应格式不对,先重试排除瞬时故障 - 第二步看
return_code是否为-1:它表示当前构建不在官方版本库里,属正常状态而非网络故障,弹窗会询问是否切到官方版 - 第三步若日志是 "Your OS isn't currently supported":编译目标不在 windows/linux/mac 之列,自动更新本就不支持该平台
故障三:下载出现 Hash mismatch 或 size mismatch
- 第一步先看大小比对:它在哈希之前执行,大小不一致就是下载本身不完整,重试即可
- 第二步大小正确但哈希不匹配:包内容与服务器声明不符,先排除中间代理改写响应
- 第三步重试仍不匹配则放弃本次更新。此时更新器未写入任何文件,不要手动解压安装包
下一步怎么走
- 对最近一次启动的日志执行
grep UPDATER,能读通行序,即可判定大部分更新问题 - 想深入:读 update_manager.h 的
update_info结构体,它是全流程唯一的状态载体,字段含义就是流程图
【免费下载链接】rpcs3PlayStation 3 emulator and debugger项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考