
Meta 将 Android 虚拟设备框架 Cuttlefish 原生移植到 Apple Silicon Mac
来源标题:Cuttlefish on Mac: Running Android’s Virtual Device Framework Natively on Apple Silicon
Meta Reality Labs 把 AOSP 的 Cuttlefish 虚拟设备框架及其 QEMU 后端移植到 macOS 和 Apple Silicon,此前该框架仅支持 Linux。Cuttlefish 能启动与真实硬件相同的系统镜像,比轻量级模拟器 Goldfish 更贴近物理设备行为。这一移植让在 Mac 上工作的开发者不再需要同时维护 Goldfish 和 Cuttlefish 两套环境。
以下正文由 AI 翻译自 Meta Engineering(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Meta 的 Reality Labs 负责打造 AI 眼镜等产品。模拟器让我们能够在不依赖稀缺物理硬件的情况下扩展开发与测试。
针对非手机类 Android 设备的软件测试,其效果取决于虚拟设备能在多大程度上复现物理产品的软件行为。像 Goldfish 这样的轻量级模拟器虽然能解决一部分问题,但它与真实设备之间的差异可能会把 bug 隐藏到开发后期才暴露。这种保真度的缺失还会削弱人们对设备模拟的信任,导致对稀缺物理硬件的依赖进一步加重。
Cuttlefish 是 Android 开源项目(AOSP)的虚拟设备框架,用于在虚拟硬件上测试 Android 软件。它启动的系统镜像与真实硬件相同,并在虚拟硬件上运行贴近真实的软件栈。这让 Cuttlefish 能够比轻量级模拟器更紧密地跟踪物理设备的行为。
遗憾的是,Cuttlefish 仅支持 Linux,而我们的应用与库开发者使用的是搭载 Apple 芯片的 Mac。这迫使我们同时维护 Goldfish 和 Cuttlefish 两套方案。
我们清楚,如果能整合到单一的、基于 Cuttlefish 的平台,就能让所有开发者都用上同样的高保真虚拟设备。难点在于移植整个技术栈,让 Cuttlefish 在 macOS 上原生运行。
碎片化的代价
同时维护两套模拟器平台带来了沉重的运维负担:它消耗计算资源,让开发者感到困惑,也拖慢了模拟器团队。每个工具都需要支持两个独立平台,基础设施和工程能力也被一分为二。此外,开发者还必须根据自己的工作方式选择模拟器目标:Goldfish 到处都能跑,但保真度较低;Cuttlefish 则需要 Linux。
AOSP 本身就反映了这种分野:Goldfish 面向应用开发者,而 Cuttlefish 服务于 Android 平台开发者。只要维持这种分隔,我们就会持续承受碎片化带来的后果。
技术栈与 macOS 上的缺口
Cuttlefish 是编排层,而真正运行客户机操作系统的是虚拟机监视器(VMM)。在 Linux 上,Cuttlefish 通常使用 crosvm,但此前也曾支持 QEMU 作为备选 VMM。随着时间推移,那套集成逐渐处于失活状态。为了在 macOS 上实现 Apple 芯片原生支持,我们重新启用了 QEMU 支持。
Cuttlefish 的许多虚拟设备使用 vhost-user 后端——这些独立进程通过 socket 向 QEMU 提供 virtio 设备。这一架构很清晰,但其中很大一部分是带着硬性的 Linux 假设编写的。其中有三个假设在 macOS 上不成立。vhost-user 机制被限制在 Linux 上,无法构建或运行。Apple 的 hypervisor 施加了 QEMU 未曾预料到的资源限制。最后,原生显示、构建和签名路径都不存在。我们逐一解决了这三个问题。
Cuttlefish-on-Mac 技术栈。Cuttlefish 编排由 QEMU 支撑的虚拟设备。橙色高亮部分是 Mac 专属工作:为 vhost-user 添加 macOS 支持、增加 QEMU HVF 后端中的内存区域跟踪槽位,以及使用原生 Cocoa 显示和代码签名路径。
让 vhost-user 走出 Linux
结构上最重要的改动在 QEMU 的 vhost-user 路径中。前端、libvhost-user,以及 vhost-user-blk 之类的 contrib 后端,此前都被限制在 Linux 上。我们放宽了这些构建限制,使 vhost-user 前端和库既能在 Linux 上构建,也能在 macOS 上构建。这样一来,Cuttlefish 的设备后端在 Mac 上也能像在 Linux 上一样交给 QEMU 处理。没有这一步,让 Cuttlefish 值得一用的高保真设备模型就无法在 Linux 之外使用。
在 Hypervisor.framework 的约束下工作
在 Apple 芯片上,QEMU 通过 HVF(Hypervisor.framework)而非 KVM 进行加速。QEMU 的 HVF 后端没有跟踪足够多的内存区域,无法满足较大的 Cuttlefish 配置。我们提高了其跟踪槽位数量,使这些配置能够正确运行。
可用的原生显示
本地应用开发需要可交互的显示,让开发者能够直接查看虚拟设备并与之交互。为了实现直接交互并摆脱对 WebRTC 接口的依赖,我们转向了 QEMU 的原生 Cocoa 显示。相关改动包括:
- BGRA 像素格式支持:确保显示渲染准确,消除 Apple 芯片上的视觉伪影。
- 鼠标点击即触摸:将指针操作转换为触摸输入,以便与触摸屏设备交互。
- 自定义几何参数:为 graphic_console_init 增加 -g 标志,用于显示配置。
我们还启用了不稳定的 Rutabaga 结构体,以匹配 gfxstream/rutabaga 配置中 Rust 侧的图形 ABI。
在 Apple 芯片上构建与签名
最后是构建和打包工作:初步的 Darwin 构建支持、在 macOS 上为 arm64 构建 QEMU,以及工具链修复。macOS 构建除了需要代码签名和公证支持外,还需要 JIT entitlement。在 Cuttlefish 一侧,我们添加了 macOS 宿主支持,使该框架的编排部分能够在 Mac 上构建和运行,而不再假设宿主是 Linux。
收益
通过迁移到统一平台,我们降低了维护要求,减少了基础设施需求,消除了冗余工具,提升了保真度,并确保开发者运行的是与 CI 中完全相同的 Cuttlefish 虚拟设备。
单一平台也让在共享技术栈上支持各种能力变得更加容易,包括:
- 蓝牙配对与连接。
- Wi-Fi。
- 蜂窝网络。
- 3D 图形。
- 无线更新(OTA)测试,用于在虚拟设备上演练无线更新流程。
- Fastboot。
- 快照,用于在 CI 和开发流程中保存与恢复设备状态。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。