跳到正文
RadarAI· Meta Engineering Blog(RSS)·· 3 小时前AI 评分42

Meta 将 Android 虚拟设备框架 Cuttlefish 原生移植到 Apple Silicon Mac

AI 导读

Meta 将 AOSP 的虚拟设备框架 Cuttlefish 原生移植到 Apple Silicon Mac,让 Mac 开发者用上与 CI 相同的高保真虚拟设备。

正文 · AI 翻译

Meta 工程博客·2026-11-14 01:00· 48 分钟前AI 评分44

Cuttlefish on Mac:在 Apple Silicon 上原生运行 Android 虚拟设备框架

AI 导读

Meta 把 AOSP 的虚拟设备框架 Cuttlefish 原生移植到 Apple silicon Mac,让 Mac 开发者也能用上与 CI 相同的高保真虚拟设备。

正文 · 原文

Meta 的 Reality Labs 打造了诸如 AI 眼镜 等产品。模拟器为我们提供了一种扩展开发与测试的方式,无需依赖稀缺的物理硬件。

针对非手机 Android 设备的软件测试,取决于虚拟设备能在多大程度上复现物理产品的软件行为。像 Goldfish 这样的轻量级模拟器能解决一部分问题,但与真实设备的差异可能会让缺陷隐藏到开发后期才暴露。这种保真度的缺失也会削弱对设备模拟的信任,增加对稀缺物理硬件的依赖。

Cuttlefish 是 Android 开源项目(AOSP)的虚拟设备框架,用于在虚拟硬件上测试 Android 软件。它启动与真实硬件相同的系统镜像,并在虚拟硬件上运行逼真的软件栈。这使得 Cuttlefish 能比轻量级模拟器更贴近地追踪物理设备的行为。

遗憾的是,Cuttlefish 仅支持 Linux,而我们的应用和库开发者使用的是搭载 Apple silicon 的 Mac。这迫使我们同时支持 Goldfish 和 Cuttlefish。

我们知道,如果能整合到单一的 Cuttlefish 平台上,就能让所有开发者都享受到同样的高保真虚拟设备。挑战在于移植整个技术栈,让 Cuttlefish 在 macOS 上原生运行。

碎片化的影响

维护双模拟器平台带来了沉重的运维负担:它消耗计算资源,给开发者造成困惑,并拖慢了模拟器团队。每个工具都需要支持两个独立平台,而基础设施和工程能力也被分散到两者之间。此外,开发者不得不根据自身的工作方式选择模拟器目标:Goldfish 到处都能运行但保真度较低,而 Cuttlefish 需要 Linux。

AOSP 也反映了这种完全相同的分化:Goldfish 面向应用开发者,而 Cuttlefish 服务于 Android 平台开发者。只要我们维持这种分化,就会持续受到碎片化的影响。

技术栈与 macOS 的缺口

Cuttlefish 是编排层,而真正运行客户机操作系统的组件是虚拟机监视器(VMM)。在 Linux 上,Cuttlefish 通常使用 crosvm,但此前也曾包含对 QEMU 作为替代 VMM 的支持。该集成随着时间推移已变得不再活跃。为了在 macOS 上实现原生 Apple silicon 支持,我们恢复了 QEMU 支持。

Cuttlefish 的许多虚拟设备使用 vhost-user 后端,这些独立进程通过套接字向 QEMU 提供 virtio 设备。该架构很清晰,但其中很大一部分是在假定使用 Linux 的前提下编写的。其中三项假设在 macOS 上不成立。vhost-user 机制被限制在 Linux 上,无法构建或运行。Apple hypervisor 施加了 QEMU 未曾预料到的资源限制。最后,原生显示、构建和签名路径都不存在。我们解决了全部三个问题。

Mac 上的 Cuttlefish 技术栈。Cuttlefish 编排由 QEMU 支持的虚拟设备。高亮的橙色块是 Mac 特定的工作:为 vhost-user 添加 macOS 支持、增加 QEMU HVF 后端中的内存区域跟踪槽位,以及使用原生 Cocoa 显示和代码签名路径。

让 vhost-user 可移植到 Linux 之外

结构上最重要的改动在 QEMU 的 vhost-user 路径中。前端、libvhost-user 以及 vhost-user-blk 等 contrib 后端此前都被限制在 Linux 上。我们放宽了这些构建限制,使 vhost-user 前端和库可以在 macOS 以及 Linux 上构建。这让 Cuttlefish 的设备后端在 Mac 上能够像在 Linux 上一样移交给 QEMU。没有这一点,让 Cuttlefish 值得使用的高保真设备模型就无法在 Linux 之外使用。

在 Hypervisor.framework 的限制内运行

在 Apple silicon 上,QEMU 通过 HVF(Hypervisor.framework)而非 KVM 进行加速。QEMU 的 HVF 后端没有跟踪足够多的内存区域,无法支持较大的 Cuttlefish 配置。我们增加了其跟踪槽位数量,使这些配置能够正确运行。

可用的原生显示

本地应用开发需要交互式显示,让开发者能够查看虚拟设备并直接与其交互。为实现直接交互并摆脱对 WebRTC 接口的依赖,我们改用 QEMU 的原生 Cocoa 显示。改动包括:

  • BGRA 像素格式支持:实现准确的显示渲染,消除 Apple silicon 上的视觉伪影。
  • 鼠标点击即触摸:将指针操作转换为触摸输入,以便与触摸屏设备交互。
  • 自定义几何选项:为 graphic_console_init 添加 -g 标志以进行显示配置。

我们还启用了不稳定的 Rutabaga 结构体,以匹配 gfxstream/rutabaga 配置中 Rust 侧的图形 ABI。

在 Apple silicon 上构建和签名

最后是构建和打包工作:初步的 Darwin 构建支持、在 macOS 上为 arm64 构建 QEMU,以及工具链修复。macOS 构建还需要 JIT 授权,以及代码签名和公证支持。在 Cuttlefish 方面,我们添加了 macOS 主机支持,使该框架的编排能够在 Mac 上构建和运行,而不再假定使用 Linux 主机。

优势

通过迁移到统一平台,我们减少了维护需求、降低了基础设施要求、消除了冗余工具、提升了保真度,并确保开发者运行与 CI 中完全相同的 Cuttlefish 虚拟设备。

单一平台还使在共享技术栈上支持各项能力变得更加容易,包括:

  • 蓝牙配对与连接。
  • Wi-Fi。
  • 蜂窝网络。
  • 3D 图形。
  • 无线 (OTA) 更新测试,以针对虚拟设备演练无线更新流程。
  • Fastboot。
  • 快照,以在 CI 和开发流程中保存和恢复设备状态。

除了支持 Reality Labs 的工程师之外,这一相同的虚拟设备还与我们生态系统的外部开发者共享。这种一致性保证了第三方团队测试所用的平台,与我们开发和验证操作系统本身所用的基于 Cuttlefish 的平台完全相同。

随着 AI 智能体在 Android 开发中发挥越来越大的作用,验证执行和运行时行为与代码生成同样重要。虚拟设备使工程师和自动化智能体能够在隔离环境中并发运行,促进应用执行和快速迭代。通过实现即时状态重置和重复测试运行,团队消除了对共享物理硬件的依赖,并防止工作流中断。最终,高保真仿真确保这些持续反馈循环既快速又有意义。

回馈社区

尽管我们是为 Reality Labs 内部的开发而构建这一方案,但 macOS 支持在我们的产品之外同样有用。我们与社区分享我们的工作,以便其他开发者能够在我们工作所依托的 QEMU 和 AOSP 基础上继续构建。

我们分两部分发布这项工作:

这些仓库包含我们的 QEMU 更改和 Cuttlefish 补丁系列,以及构建和补丁应用说明。

我们还在探索将这些更改上游贡献给 QEMU 和 AOSP 的方法。与此同时,开发者可以使用我们的分支和补丁集。

致谢

本项目依托 QEMU 和 Cuttlefish/AOSP 社区奠定的基础。我们尤其感谢 vsock-user 实现,它由 Stefano Garzarella 创建,直接促成了我们的 macOS 集成。

还要特别感谢 Meta 的 Olya Arkhangelskaia 和 Tom Care 将 Cuttlefish 引入 macOS 的基础性工作,以及 Jeffrey Effendy 对原生 Mac 开发者体验的改进和后续产品化工作。

文章 Cuttlefish on Mac: Running Android’s Virtual Device Framework Natively on Apple Silicon 首次发表于 Engineering at Meta。

来源:Meta Engineering Blog · engineering.fb.com

来源:RadarAI · aihot.news