Launchpad コマンドライン
vphone-launchpad-cli は、実行中の Launchpad をターミナルやスクリプトから操作します。バンドルのインストール、マシンの作成、起動、停止、ゲストとのやり取りができます。ウィンドウをクリックして回らずに Launchpad の機能を使いたい場合に使います。
準備する
CLI は vphone-launchpad.app/Contents/MacOS に同梱されています。PATH にリンクを作成します。
Launchpad が実行されていない場合は、CLI が Launchpad を起動します。CLI が起動した Launchpad は非表示で開き、前面のアプリからフォーカスを奪いません。ウィンドウを表示するには、Dock アイコンをクリックするか、メニューバーの Open Launchpad を選びます。代わりにウィンドウを前面にして起動するには、--foreground を指定します(コマンドの前、または exec 以外の任意のコマンドのオプションの中に置きます)。どちらも、すでに実行中の Launchpad には影響しません。
出力と終了ステータス
- 進行状況の行は、発生するたびに stderr に出力されます。
- 結果は 1 つの JSON ドキュメントとして stdout に出力されます。
- 終了ステータスは成功時に 0、失敗時に 1 で、理由は stderr に出力されます。
- CLI を中断すると、取り消せるコマンド(
exec、待機、CFW のインストール)は取り消されます。バンドルのインストールとマシンの作成はウィンドウに属するため、実行が続きます。
すべてのコマンドは、Launchpad のウィンドウとコマンド履歴にも表示されます。
コマンド
2 つのライブラリに同じ名前のマシンがある場合、マシンのコマンドには --root <library> を指定します。
状態とバンドル
ローカルビルドのインストール、マシンのローカルビルドへの移行、2 つのビルドの比較については、Core Bundle とローカルビルドをご覧ください。
マシン
注意:
vm listでマシンがrunningになるのは、ディスクを保持しているのが仮想マシンのプロセス(vphone-vm、または Virtualization の仮想マシンサービス)の場合だけです。ディスクを開いているほかのプロセス(tail、Spotlight、バックアップツール)はdiskOpenInに表示され(例:12925 tail)、マシンはstoppedのままです。vm startは、vphone-cli vm launchと同じく、ディスクを開いているだけのプロセスがあっても拒否されません。そのプロセスの名前を示すメモが表示されます。vm start --waitとvm waitは--timeoutも受け付けます。vm set-bundle --update-environmentは、そのバージョンのゲスト環境も配置し直すため、マシンを停止しておく必要があります。ほかのプロセスがディスクを開いている場合は、紐付けを変更する前に、そのプロセスの名前を示して拒否されます。更新自体が失敗した場合、マシンは新しいバージョンに紐付いたままで、vm listには古いguestEnvironmentBundleが表示されたままになります。cfw update-environmentを実行して完了させてください。
CFW
これらは停止中のマシンに対し、マシン自身のバンドルを使って Launchpad のヘルパーを通じて実行されます。ほかのプロセスがディスクを開いている場合は、そのプロセスの名前(12925 tail)を示してそれぞれ拒否されます。
ゲスト
guest コマンドと --wait は、マシンの vphone.sock を通じて動作します。このソケットはすべての起動で提供されます。2.0.9 までのバンドルでは、ウィンドウ付きで起動したマシンでのみ提供されます。
vphone-cli を実行する
マシンを作成する
vm create は、--bundle <version> または標準のバンドルに紐付けて New Machine の処理を実行します。マシンはテンプレートから複製され、テンプレートがない場合は先に作成されます(2.9)。--no-template を指定すると単独で復元されます。
パーサは --iphone-source、--cloudos-source、--cpu、--memory、--disk-size、--network、--keep-artifacts、--no-wait も受け付けます。vphone-launchpad-cli help をご覧ください。
結果には、テンプレート、この作成処理がそのテンプレートを作ったかどうか、使用したパッチが表示されます。
その他のデバイス
さらに 2 つの場合では、ヘルパーを通じて root として手順が実行されます。
--preset minimal(Minimal:未変更のブートチェーン、カーネル、TXM を使い、復元前にシステムをカスタマイズします)も軽量化なしで単独で復元され、そのfw patchはヘルパーを通じて root として実行されます。Userspace debugging のボックス(vphone-cli fw patchesの Features にあるuserspace-debugging)は、そこに記載された各パッチに対する--allowです。- cloudOS に vphone600 のコンポーネントがないマシン(そのリリース自身の cloudOS、Watch、iOS 18 ゲスト)では、kernelcache ミックスを
fw kernelcacheで準備し、ヘルパーが root としてリンクします。
パッチの上書き設定
--block <patch> と --allow <patch> には、vphone-cli fw patches が表示する識別子を、パッチごとに 1 回ずつ指定します。
Launchpad は作成処理のバンドルからそのカタログを読み込み、どのパッチセットにも宣言されていない識別子や、ブロックと許可の両方に指定された識別子を拒否し、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 を拒否します。やり直す場合は、作成処理のパッチがそのまま使われます。
結果に含まれるバンドルのフィールド
guestEnvironmentBundle が bundle と異なる場合、ホストとゲストは別のビルドのものです。cfw update-environment でゲストを合わせられます。
タッチ座標とディスプレイの形状
guest send のタッチ座標は、t:screenshot が返す直立したスクリーンショット全体を基準にします。90 度回転すると、幅と高さが入れ替わります。ホストは、GUI でもヘッドレスでも、その座標を固定パネルの HID 座標に変換します。スワイプは、開始時に取得した形状を使い続けます。スクリーンショットの間に形状が変わった場合は、入力座標があいまいな画像の代わりにエラーが返されます。
回転時の座標のずれを診断するには、形状を読み取ります。
ホストで設定されたピクセル寸法と取得したピクセル寸法に加え、表示中のディスプレイビューの境界、回転、アスペクト比を保った描画領域、ポインタとタッチの経路が返されます。入力やディスプレイの状態は何も変わりません。capture_pixels はホストの生のフレームで、screenshot_pixels と input_orientation は入力座標を表します。device.screen、display.orientation、ゲストが実際に受け取るイベントと比較してください。
接続の仕組み
CLI は、~/Library/Application Support/vphone-launchpad/control.sock(モード 0600、同じユーザにのみ提供)の Unix ソケットを通じて、実行中の Launchpad と通信します。CLI は権限も独自の状態も持ちません。バンドルは Launchpad のヘルパーを通じてインストールされ、各マシンは自身の Core Bundle の vphone-cli を通じて実行されます。ネットワークでリッスンするものは何もありません。別のマシンから使うには、ssh で接続してください。