Skip to content

更新:根目录文件被别的程序占着时,换包前就停 - #137

Merged
qiyinxi merged 1 commit into
ModAVD:mainfrom
qiyinxi:feat/package-mumu-shim
Nov 12, 2026
Merged

qiyinxi merged 1 commit into
ModAVD:mainfrom
qiyinxi:feat/package-mumu-shim

Conversation

@qiyinxi

@qiyinxi qiyinxi commented Nov 12, 2026 •

Copy link
Copy Markdown
Member

ModAVD 包会带上 MuMu 兼容外壳 mumu-shim\shell\sdk\external_renderer_ipc.dll(ModAVD/ModAVD#189),单独装的 MAA 把 MuMu 路径填成 <根目录>\mumu-shim 后会载入它;MAA 也会载入已经在包里的 extras\modavd_extras.dll。

原来的问题

换包时 planRootFiles 把 pkg\ 里的每个文件都列进 replace(没变的也换),applyRootFiles 用 os.Rename 覆盖。被载入的 DLL 不能覆盖,失败发生在 sdk\emulator 已经换完之后:recoverAfter 往前补,同样失败,根目录停在一半(新模拟器、一部分旧的根目录文件),状态一直是「换上中」,直到 MAA 关掉、下次恢复才收尾。lockForSwap 只查模拟器和 ModAVD 自己的程序,查不到 MAA。

改了什么

swapIn 在备份之后、写「换上中」之前,把要替换和要删的根目录文件逐个以写方式打开试一下(rootFileInUse / fileInUse):共享冲突或锁冲突就算被占用,退回「待安装」(暂存的新版留着),报 Busy:<文件> 正被别的程序占用(多半是 MAA 之类载入了它),什么都没动。请先关掉它再装。只读、不存在的文件不算;正在跑更新的程序自己不算(照旧先挪进回收目录)。macOS、Linux 不做这项检查。

检查和替换之间还有很短的空档,那时才载入的仍会走原来的恢复路径。

被 AUTO-MAS 换成另一份时

AUTO-MAS 也会往同一路径拷它自带的外壳,所以用户目录里的文件可能和清单不同:

  • 整包、按范围下载:照常装上包里的那份(AUTO-MAS 那份进备份,装完清掉),不失败。新加了用例。
  • Mirror 酱增量包:没变的文件从根目录照抄,外壳和新清单对不上,核对失败,按现有逻辑改从 GitHub 下整包(多下一次);连不上 GitHub 时这次更新会失败。这一处这次没改。

测试

  • go test ./internal/... 全过,gofmt -l 干净,go vet ./internal/update/(windows、darwin、linux)干净。
  • 新增 internal/update/inuse_dll_windows_test.go:
    • 真的用 LoadLibrary 载入一份系统 DLL 的副本,fileInUse 认出被占用;释放后、普通文件、只读文件、不存在的文件都不算。
    • 根目录的外壳被载入着时 Install 返回 Busy,文件名和提示都对,模拟器和根目录文件都没变,没留下 previous\,状态是「待安装」;释放后再装成功。
    • 外壳被换成另一份时整包更新成功。
  • 手动变异 5 处(不调用检查、不认共享冲突、所有打开错误都算占用、检查从不报、被挡时不退回「待安装」),每处都有用例失败。

Refs ModAVD/ModAVDExtras#12

MAA 会载入根目录的 extras\modavd_extras.dll,ModAVD 包里还要带上
mumu-shim\shell\sdk\external_renderer_ipc.dll(MAA 的 MuMu 路径填
<根目录>\mumu-shim 时载入)。以前要换的文件被载入着,要到换完 sdk\emulator
以后替换它时才失败,根目录停在换了一半的状态,当场恢复也一样失败,直到关掉
MAA 才能收尾。

现在换包前(备份之后、写「换上中」状态之前)把要替换和要删的根目录文件
逐个试着以写方式打开,被占用(共享冲突、锁冲突)就停:什么都没动,暂存的
新版留着,提示是哪个文件、先关掉 MAA 之类载入它的程序再装。正在跑更新的
程序自己不算(它照旧先挪进回收目录)。

只读、不存在的文件不算占用;macOS、Linux 上载入的库不挡替换,不做这项检查。

Refs ModAVD/ModAVDExtras#12
@qiyinxi qiyinxi added the enhancement New feature or request label Nov 12, 2026
@qiyinxi
qiyinxi added this pull request to the merge queue Nov 12, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 12, 2026
@qiyinxi
qiyinxi added this pull request to the merge queue Nov 12, 2026
Merged via the queue into ModAVD:main with commit 68e0fac Nov 12, 2026
6 checks passed
qiyinxi added a commit that referenced this pull request Nov 12, 2026
* 没起名的实例显示「实例 N」;版本号和模拟器构建号分开 (#135)

* 没起名的实例显示「实例 N」;版本号不再要求中间那位等于 mas-N

- 界面:没起名的实例显示「实例 N」,新建和设置里的提示跟着改;卡片副标题照旧带文件名 mas_N。命令行 list 的名称列没起名时写「—」。盘上的 mas_N 不动。
- 版本:0.40 以后公开版本号单独往上加,模拟器构建号只写在 modavd-manifest.json 的 "build" 里。
  - 认本地版本:清单的 build 等于 Pkg.BuildId 就用清单的版本;没有 build 的老清单照旧按中间那位核对;对不上时只有 mas-40 及以前才退回 0.<build>.0。
  - 装包:清单的 build 只要求是正整数;核对模拟器时拿 Pkg.BuildId 和清单的 build 比(老包没有 build 就和中间那位比)。macOS 原生包同理。

* CI:decouple_test 只在 Windows 编、gofmt;没起名的卡片副标题照旧写编号

* 界面测试的 format.js 替身补上 ownTitle

* 电脑检查去掉「检查对象」下拉框 (#136)

#118 以后电脑检查不再查内存,所有实例结果都一样。删掉页面上的检查对象下拉框和相关提示,
GET /api/check 去掉 index 参数和 instance_index、memory_mb、root_ready,缓存不再按内存区分,
删掉只为跳过 memory 项的 CheckResult.RootReady()。

* 模拟器内存写进开机守护日志,问题包加模拟器和占内存最多的程序 (#138)

* 开机守护每 10 分钟把模拟器内存写进日志,问题包 summary 加模拟器进程的内存

* 问题包 summary 加「占内存最多的程序」一节

* 更新:根目录文件被别的程序占着时,换包前就停 (#137)

MAA 会载入根目录的 extras\modavd_extras.dll,ModAVD 包里还要带上
mumu-shim\shell\sdk\external_renderer_ipc.dll(MAA 的 MuMu 路径填
<根目录>\mumu-shim 时载入)。以前要换的文件被载入着,要到换完 sdk\emulator
以后替换它时才失败,根目录停在换了一半的状态,当场恢复也一样失败,直到关掉
MAA 才能收尾。

现在换包前(备份之后、写「换上中」状态之前)把要替换和要删的根目录文件
逐个试着以写方式打开,被占用(共享冲突、锁冲突)就停:什么都没动,暂存的
新版留着,提示是哪个文件、先关掉 MAA 之类载入它的程序再装。正在跑更新的
程序自己不算(它照旧先挪进回收目录)。

只读、不存在的文件不算占用;macOS、Linux 上载入的库不挡替换,不做这项检查。

Refs ModAVD/ModAVDExtras#12

* 没起名的实例默认显示 emu-N;卡片规格行不再写「盘自动扩」 (#139)

- 没起名的实例在界面显示 emu-N(原「实例 N」),新建和设置里的提示、占位跟着改;命令行 list 的名称列没起名时也写 emu-N。盘上的 mas_N 照旧不动。
- 卡片的规格行:自动扩盘是默认,不再写「盘自动扩」;指定大小的照旧写「盘 N GB」。

* 版本号改为 0.9.0

go generate ./cmd/modavd-gui 重新生成两份 syso,exe 文件属性里的版本号跟着变。

* 实例卡片显示数据盘实际占的电脑硬盘 (#140)

规格行末尾加「占 12.3 GB」:数据盘文件在电脑上现在实际占的大小(data_space.host_bytes,只算写进去的),读不到就不写。

* ModAVDManager v0.9.0 的说明和 SHA256SUMS

挑进 #140(实例卡片显示数据盘实际占的电脑硬盘)。

* 说明:随 ModAVD 0.40.1 进包(0.8.0 的更新只认版本中间那位等于构建号,这一版用 0.40.1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant