和官方模拟器有什么不同
下面是当前版本(0.36.0,构建号 mas-36,基于 Google AOSP Android Emulator 37.2.10)里对使用者有影响的改动。逐个补丁见 ModAVD 仓库的 patches/,每一版的改动见 Release 说明。
不往外发东西
- 不上传使用统计(
-metrics-collection按-no-metrics处理)。 - 不上传崩溃报告,也不弹窗询问;崩溃转储只存在本机,保留最新 5 份。
- 开机不检查更新,不下载特性开关(用本地缓存或包里自带的那一份)。
详见隐私。
扛得住强行结束
- 数据盘以直写(write-through)方式交给安卓,强行结束模拟器进程不会弄坏虚拟磁盘(qcow2)的元数据,我们的硬杀测试里没有出现过损坏。关机前最后几秒还没写到盘上的文件仍可能丢失。
- 修了崩溃处理程序(crashpad_handler)随机退出的问题。原来它退出以后,模拟器再崩溃时会一直卡住、也不留转储。
少占资源
- 支持内存气球的空闲页回报:安卓里释放的内存会还给 Windows。省的是实际占用的物理内存,不是提交量,效果看负载。
- 新建实例第一次开机时,不再临时占满数据盘上限的空间。数据盘所在的盘是 NTFS 或 ReFS 时,首次建盘只要求 10 GB 可用(官方版要求上限的 1.2 倍,64 GB 上限要 77 GB)。
- 不指定
-logcat时,不再把安卓日志转发到电脑这边。 - 图形暂存缓冲从 16 MB 起按需增长(上限仍是 128 MB),不再一开机就分配 128 MB。NVIDIA 显卡上每台实例静置时少占约 140 MB 内存。
磁盘
- 安卓一次提交的多段小块读写(合计不超过 64 KiB)先拼成一块再交给 Windows,每次写盘的系统调用从约 4 次降到 1 次。
- 数据盘可以改大,游戏数据不动:配置的数据盘比现有的大时,开机前只把虚拟磁盘扩大(从不缩小),安卓开机后在线扩满。官方版这时要么不生效,要么清空整个实例。
- 新建数据盘时 inode 最多 1,048,576 个(16 GB 分区的默认值),64 GB 数据盘的 inode 表从 1 GiB 降到 256 MiB,新实例少占约 0.7 GB 磁盘。已有的盘不变。
- 新建数据盘的 resize inode 按内核在线扩容的要求排布,以后按 16 GB 建的盘可以完整地改大(以前只能扩到约 30 GB)。
Windows 虚拟机监控程序平台(WHPX)
- 修了暂停、恢复、读快照前后客体时钟(TSC)不同步的几处问题。
- 本地 APIC 默认交给 Windows 虚拟机监控程序模拟。
- 虚拟 CPU 上限从 6 个提到电脑逻辑处理器数的一半。
网络
- 每个 TCP 连接的缓冲区从 8 KiB 提到 128 KiB。
- 在 Windows 上轮询全部网络连接,原来只看前 128 个。
- 电脑这边的连接加了短保活,对端失联时能更快断开。
- 修了注销一个没登记过的连接时读空指针、模拟器整个退出的问题(实例重启后 adb 重连时遇到过;官方代码里也有)。
图形(gfxstream)
- 修了 NVIDIA 显卡上约 2%–5% 的画面读回成全黑的问题(闪屏、截图偶发全黑)。已提交上游。
- 修了渲染线程争用 OpenGL 上下文的问题。原来游戏切换视频时,可能因为 YUV 转换着色器编译失败,整个模拟器直接退出。
- 安卓里的程序在 Vulkan 查询里带上电脑这边不认识的扩展结构(光线追踪、网格着色器等)时,不再直接退出。《明日方舟:终末地》原来一建 Vulkan 设备,模拟器就退出。
- 修了几处 Vulkan 描述符模板更新和 OpenGL ES 计算着色器的兼容问题,以及视频硬解(CUDA)路径的一处崩溃和几处显存泄漏。
- 加了两个默认关闭的环境变量开关:
ANDROID_EMU_VK_HIDE_REBAR=1:把电脑上「显存且主机可见」的内存(NVIDIA ReBAR)对安卓只报成显存;ANDROID_EMU_VK_ASTC_BC3=1:在模拟 ASTC 纹理时解压成 BC3(实验性)。
界面与日志
- 侧边工具栏精简为电源、音量加减、返回、主页(另有最小化和关闭)。设环境变量
ANDROID_EMU_FULL_TOOLBAR=1可以恢复完整工具栏。 - 日志每行立即写出,标准错误输出不再整块缓冲,崩溃前的最后几行不会丢。
- 程序图标和窗口图标换成了 ModAVD 自己的图标(见许可证与源码)。
输入法
- 加了宿主输入法通道(goldfish pipe 服务
modavd_ime)和控制台命令ime,配合安卓里的客体输入法,可以在模拟器窗口里直接用 Windows 输入法给安卓打中文等文字。 - 0.36.0 起客体输入法随包提供(
components\modavd-ime.apk),用管理器或命令行开机时自动装上;没装时模拟器的行为和之前一样。见宿主输入法。
arm64 执行桥
- 实例目录里有开机标记
modavd-writable-system时,不管由谁启动,都按可写系统镜像开机。 - 0.36.0 起的 arm64 执行桥装进实例时放上这个标记、卸掉时删掉,所以装过桥的实例照常用 AUTO-MAS 开机,桥也在。没有标记的实例和之前一样。见 arm64 执行桥。
拿掉的文件
和官方构建装出来的文件相比,Release 包里没有这些(运行模拟器用不到):
bin64\(Cygwin 版 e2fsprogs)、drivers\(USB 直通驱动);- 虚拟相机场景、宏示例和 Pixel 10 皮肤、FlatBuffers 开发文件;
- ARM 和 32 位 x86 的
qemu-system。
所以只能运行 x86_64 系统镜像,也没有 -usb-passthrough 和虚拟场景相机。