苹果虚拟化框架能让你在 Mac 上直接运行 iPhone,原理 surprisingly simple

苹果虚拟化框架能让你在 Mac 上直接运行 iPhone,原理 surprisingly simple
Diebug
为什么要在 Mac 上跑 iPhone
对 iOS 开发者来说,Xcode 自带的模拟器一直是标准工具。但你有没有想过,模拟器到底是什么?
Xcode 模拟器本质上是一个经过高度定制的虚拟机。它在你的 Mac 上模拟了 iPhone 的硬件环境——CPU、内存、屏幕、传感器——然后运行一个修改过的 iOS 系统。你点击”运行”按钮后,Xcode 会编译你的代码,打包成一个 IP 文件,然后启动模拟器实例,最后把代码推送到模拟器里执行。
整个过程很流畅,所以你很少会注意到背后发生了什么。但如果你仔细看,会发现模拟器有一些奇怪的局限:它不支持所有 iOS 功能(比如 Face ID、特定的传感器),它的性能也不如真机,而且你只能运行你开发的 App,不能安装任意 App。
如果有人告诉你,有一个工具可以用命令行在 Mac 上直接启动一个完整的 iPhone,而且能运行任何你安装好的 App——你会信吗?
vphone-cli 是什么
开发者为什么做这件事
Lakr233 是一个独立开发者,主要做 iOS 安全相关的研究。他在博客中分享过不少关于 iOS 漏洞分析和逆向工程的内容。
做这个项目的直接原因是他在测试某个 iOS 应用时发现,Xcode 模拟器无法复现他在真机上观察到的行为。那个应用使用了一些模拟器不支持的硬件功能,导致测试结果和真机上有差异。
他尝试过各种方法来解决这个问题,但最终发现 Apple 的 Virtualization.framework 可以解决问题。这个框架允许你在 macOS 上创建和运行 ARM64 虚拟机,而 iPhone 用的就是 ARM64 架构。
从想法到开源
Lakr233 在 2023 年首次公开了这个项目,最初只是一个概念验证。他用了一个现成的 iOS 磁盘镜像,配合 Virtualization.framework 创建了一个基本的虚拟机启动器。
随着社区反馈,他逐步完善了功能。现在这个项目已经成了一个相当完整的工具,普通用户也能用它来测试 iOS 应用。
这个项目叫 vphone-cli,作者是 GitHub 用户 Lakr233。你可以在 GitHub 上找到它的源码。
它做的事情很简单:利用 Apple 官方提供的 Virtualization.framework,在你的 Mac 上启动一个虚拟机,这个虚拟机里跑的是一个完整的 iOS 系统。不同于 Xcode 模拟器的是,这个虚拟机不是专门为开发设计的——它是一个真正的 iOS 运行环境。
你可以通过命令行把这个虚拟机启动起来,然后像在真机上一样操作它。你可以安装 App,可以使用 Siri,可以调起相机。甚至一些模拟器不支持的功能,在这个虚拟机里也能正常工作。
作者之所以做这个工具,是因为他遇到了一个实际需求:他需要在一个更接近真机的环境中测试某些 iOS 应用的行为,但又不想每次都连上真机。Xcode 模拟器的限制让他很困扰,所以他决定自己动手。
它是怎么工作的
要理解 vphone-cli 的工作原理,你需要了解 Apple Silicon Mac 的一个特性。
Apple M 系列芯片使用的是 ARM 架构,和 iPhone 的 CPU 是同一种架构。这意味着你的 Mac 和 iPhone 的”大脑”是完全一样的。在这种架构相同的情况下,虚拟化就变得容易多了——不需要做指令集转换,虚拟机可以直接运行 iOS 的二进制文件。
Virtualization.framework 是 Apple 在 2020 年推出的一个 API,专门用来在 macOS 上创建和运行虚拟机。它封装了底层的虚拟化技术,让开发者可以用纯 Swift 或 Objective-C 代码来创建虚拟机,而不需要接触复杂的内核级虚拟化 API。
vphone-cli 的核心逻辑是这样的:
- 创建一个 ARM64 架构的虚拟机
- 加载一个经过修改的 iOS 磁盘镜像
- 启动虚拟机,让它像真正的 iPhone 一样运行
整个过程大概只需要几分钟。你不需要安装 Xcode,不需要下载几百 GB 的模拟器数据,只需要这个工具加上一个 iOS 镜像文件。
与 Xcode 模拟器的关键区别
很多人第一反应是:这和 Xcode 模拟器有什么区别?
最大的区别在于兼容性和灵活性。Xcode 模拟器是一个高度定制化的环境,它阉割了一些 iOS 功能来保证开发效率。比如它不支持所有传感器,不支持 Face ID,有些 App 在模拟器里根本无法正常运行。
vphone-cli 启动的是一个接近完整的 iOS 系统。它可以运行更多类型的应用,支持更多硬件功能。如果你需要在接近真机的环境下测试应用,它会比模拟器更可靠。
另一个区别是灵活性。Xcode 模拟器只能运行你用 Xcode 编译的应用,而且你需要先构建项目。vphone-cli 可以运行任何你已经安装的 iOS App——只要你能把它们放进虚拟机的文件系统里。
当然,它也有自己的局限。虚拟机的性能不如真机,有些对性能敏感的应用可能会比较卡顿。而且它需要你有一个 Apple Silicon 的 Mac,Intel Mac 不支持这个方案。
这个工具的实际用途
对于普通用户来说,这个工具可能没什么用。但如果你对 iOS 开发或者安全研究感兴趣,它会很有价值。
安全研究人员可以用它来研究 iOS 应用的潜在漏洞,而不需要冒着在真机上测试的风险。开发者可以用它来测试应用在接近真机的环境下的表现,特别是在一些模拟器不支持的场景下。
甚至有人用它来做 iOS 应用的逆向工程——在一个隔离的虚拟机环境中分析应用的行为,不会影响你的日常使用。
项目仓库里有详细的使用说明。如果你的 Mac 是 M 系列芯片,不妨试试。一个命令行工具就能让你体验到和 Xcode 模拟器完全不同的 iOS 环境。