Launchpad 命令行
vphone-launchpad-cli 可以在终端或脚本中操作正在运行的 Launchpad:安装 bundle,创建、启动和停止虚拟机,以及与客户机通信。想要使用 Launchpad 的功能、又不想在窗口中逐项点击时,请使用它。
设置
CLI 位于 vphone-launchpad.app/Contents/MacOS 中。把它链接到你的 PATH:
Launchpad 未运行时,CLI 会启动它。由 CLI 启动的 Launchpad 会隐藏打开,不会抢走前台 App 的焦点;点击它的程序坞图标,或菜单栏中的 Open Launchpad,即可显示窗口。如果想让它启动时窗口位于前台,请传入 --foreground(放在命令之前,或放在除 exec 以外任何命令的选项中)。两种方式都不会影响已经在运行的 Launchpad。
输出与退出状态
- 进度信息实时输出到 stderr。
- 结果是 stdout 上的一个 JSON 文档。
- 成功时退出状态为 0,失败时为 1,原因输出到 stderr。
- 中断 CLI 会取消可以取消的命令(
exec、等待、CFW 安装)。bundle 安装和虚拟机创建属于窗口,会继续运行。
每条命令也会显示在 Launchpad 的窗口和命令历史中。
命令
如果两个资料库中有同名虚拟机,虚拟机命令可以用 --root <library> 指定资料库。
状态与 bundle
要安装本地构建、把虚拟机迁移到该构建,或比较两个构建,请参阅 Core Bundle 与本地构建。
虚拟机
说明:
- 在
vm list中,只有持有磁盘的虚拟机进程(vphone-vm或 Virtualization 的虚拟机服务)才会让虚拟机显示为running。其他打开了磁盘的进程(tail、聚焦、备份工具)会列在diskOpenIn中(例如12925 tail),虚拟机仍显示为stopped。 - 与
vphone-cli vm launch一样,vm start不会因为某个进程只是打开了磁盘而拒绝启动;它会打印一条提示,指出该进程。 vm start --wait和vm wait也接受--timeout。vm set-bundle --update-environment还会重新部署该版本的客户机环境,并要求虚拟机处于停止状态。如果有其他进程打开了磁盘,它会在更改绑定之前拒绝执行并指出该进程。如果更新本身失败,虚拟机仍会绑定到新版本,vm list仍显示旧的guestEnvironmentBundle;请运行cfw update-environment完成更新。
CFW
这些命令在已停止的虚拟机上通过 Launchpad 的辅助程序运行,使用虚拟机自己的 bundle。如果有其他进程打开了磁盘,每条命令都会拒绝执行并指出该进程(12925 tail)。
客户机
guest 命令和 --wait 通过虚拟机的 vphone.sock 通信,每次启动都会提供这个套接字。2.0.9 及更早版本的 bundle 只为带窗口启动的虚拟机提供它。
运行 vphone-cli
创建虚拟机
vm create 运行 New Machine 流程,绑定到 --bundle <version> 或默认 bundle。虚拟机从模板克隆,模板不存在时会先构建(2.9);使用 --no-template 时则单独恢复。
解析器还接受 --iphone-source、--cloudos-source、--cpu、--memory、--disk-size、--network、--keep-artifacts 和 --no-wait;见 vphone-launchpad-cli help。
结果会注明所用的模板、该模板是否由这次创建构建,以及所用的补丁。
其他设备
另有两种情况会通过辅助程序以 root 身份运行某些步骤:
--preset minimal(Minimal:原装的启动链、内核和 TXM,在恢复前定制系统)也会单独恢复且不做精简,它的fw patch通过辅助程序以 root 身份运行。它的用户空间调试选项(vphone-cli fw patches中 Features 下的userspace-debugging)相当于对其列出的每个补丁使用--allow。- 对于 cloudOS 不含 vphone600 组件的虚拟机(使用其版本自己的 cloudOS、手表、iOS 18 客户机),kernelcache 组合由
fw kernelcache准备,再由辅助程序以 root 身份链接。
补丁覆盖
--block <patch> 和 --allow <patch> 接受 vphone-cli fw patches 列出的标识符,每个补丁用一次:
Launchpad 从这次创建所用的 bundle 中读取该目录,拒绝没有任何补丁集声明的标识符以及同时被阻止和允许的标识符,并像 fw set-patches 一样只保留与预设不同的部分。然后它按照 New Machine 的方式把它们分为两类:
- 启动链补丁(AVPBooter、iBSS、iBEC、LLB、TXM、kernelcache、DeviceTree …)属于模板的键。Find Template 会查找带有这些补丁构建的模板,模板构建会在
fw patch之前用fw set-patches记录它们。 - 客户机补丁不属于模板。克隆会用
fw set-patches记录它们,Apply Guest Patches 步骤会在首次启动前通过辅助程序用cfw update-environment写入。因此,只有客户机覆盖设置时会复用普通模板。
结果中的 patches 对象包含预设、blocked 和 allowed 覆盖设置,以及应用到克隆上的 guest 覆盖设置。使用 --no-template 时,所有覆盖设置都会进入虚拟机自己的恢复。--from 不接受 --block 和 --allow:重试会沿用这次创建的补丁。
结果中的 bundle 字段
当 guestEnvironmentBundle 与 bundle 不同时,宿主机和客户机来自不同的构建;运行 cfw update-environment 可以让客户机与之保持一致。
触摸坐标与显示几何
guest send 的触摸坐标以 t:screenshot 返回的完整竖直截图为准:旋转四分之一圈后,宽度和高度会互换。无论是图形界面启动还是无界面启动,宿主机都会把该点转换为固定面板的 HID 坐标。滑动会沿用开始时采样的几何信息。如果截图期间几何信息发生变化,你会收到错误,而不是一张输入坐标含义不明确的图像。
要诊断旋转后坐标不匹配的问题,请读取几何信息:
它会返回宿主机配置的和实际捕获的像素尺寸,以及当前显示视图的边界、旋转、等比适配的绘制区域和指针/触摸路径,不会改变任何输入或显示状态。capture_pixels 是宿主机的原始帧;screenshot_pixels 和 input_orientation 描述输入坐标。请将其与 device.screen、display.orientation 以及客户机实际收到的事件进行比较。
连接方式
CLI 通过 ~/Library/Application Support/vphone-launchpad/control.sock 上的 Unix 套接字(权限 0600,只为同一用户提供服务)与正在运行的 Launchpad 通信。它没有任何特权,也没有自己的状态:bundle 通过 Launchpad 的辅助程序安装,每台虚拟机都通过它自己 Core Bundle 中的 vphone-cli 运行。没有任何东西在网络上监听;要从其他机器使用它,请通过 ssh 连接。