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에 출력됩니다.
- 결과는 stdout에 JSON 문서 하나로 출력됩니다.
- 종료 상태는 성공 시 0, 실패 시 1이며, 이유는 stderr에 출력됩니다.
- CLI를 중단하면 취소할 수 있는 명령(
exec, 대기, CFW 설치)은 취소됩니다. 번들 설치와 머신 생성은 창에 속하므로 계속 실행됩니다.
모든 명령은 Launchpad의 창과 명령 기록에도 표시됩니다.
명령
두 보관함에 같은 이름의 머신이 있을 때 머신 명령은 --root <library>를 받습니다.
상태와 번들
로컬 빌드를 설치하거나, 머신을 그 빌드로 옮기거나, 두 빌드를 비교하려면 코어 번들과 로컬 빌드를 참고하세요.
머신
참고:
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를 참고하세요.
결과에는 템플릿, 이번 생성에서 템플릿을 빌드했는지 여부, 사용한 패치가 표시됩니다.
다른 기기
다음 두 경우에는 도우미를 통해 일부 단계를 root로 실행합니다.
--preset minimal(Minimal: 순정 부트 체인, 커널, TXM을 사용하고 복원 전에 시스템을 사용자화)도 경량화 없이 단독으로 복원되며,fw patch는 도우미를 통해 root로 실행됩니다. Userspace debugging 상자(vphone-cli fw patches의 Features 아래userspace-debugging)는 그 상자가 나열하는 각 패치에 대한--allow에 해당합니다.- cloudOS에 vphone600 구성 요소가 없는 머신(해당 릴리스 자체의 cloudOS, Watch, iOS 18 게스트)은
fw kernelcache로 kernelcache 믹스를 준비하고 도우미가 root로 링크합니다.
패치 재정의
--block <patch>와 --allow <patch>는 vphone-cli fw patches가 나열하는 식별자를 패치마다 하나씩 받습니다.
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이 반환하는 똑바로 세운 전체 스크린샷을 기준으로 합니다. 4분의 1 회전하면 너비와 높이가 바뀝니다. 호스트는 GUI와 헤드리스 시작 모두에서 그 지점을 고정 패널 HID 좌표로 변환합니다. 스와이프는 시작 시점에 측정한 형상을 유지합니다. 스크린샷 도중 형상이 바뀌면, 입력 좌표가 모호한 이미지 대신 오류가 반환됩니다.
회전된 좌표의 불일치를 진단하려면 형상을 읽으세요.
호스트에 구성된 픽셀 크기와 캡처된 픽셀 크기, 그리고 실시간 디스플레이 뷰의 경계, 회전, 화면비를 유지한 그리기 영역, 포인터/터치 경로를 반환하며, 입력이나 디스플레이 상태는 바꾸지 않습니다. capture_pixels는 호스트의 원시 프레임이고, screenshot_pixels와 input_orientation은 입력 좌표를 나타냅니다. 이를 device.screen, display.orientation, 그리고 게스트가 실제로 받는 이벤트와 비교하세요.
연결 방식
CLI는 ~/Library/Application Support/vphone-launchpad/control.sock의 Unix 소켓(모드 0600, 같은 사용자에게만 제공)으로 실행 중인 Launchpad와 통신합니다. CLI에는 권한도 자체 상태도 없습니다. 번들은 Launchpad의 도우미를 통해 설치되며, 각 머신은 자신의 Core Bundle에 있는 vphone-cli로 실행됩니다. 네트워크에서 수신하는 것은 없습니다. 다른 컴퓨터에서 사용하려면 ssh로 접속하세요.