VirtualizationService
會管理在 Android 系統上執行的多個客層 VM (無論是否受保護),主要是管理 crosvm 執行個體。VirtualizationService
會公開 AIDL API,系統服務或應用程式可使用這些 API 啟動、監控及停止 VM。如要使用 VirtualizationService
,請直接執行 virtmgr
,或匯入 javalib 或 rustlib,將 virtmgr
做為子程序執行。
VM 生命週期
IVirtualMachine
物件會追蹤 VM 的存取權。只要至少有一個對 IVirtualMachine
物件的參照,VM 就會繼續執行 (除非自行當機或關機)。如果在 VM 關閉前捨棄對 IVirtualMachine
物件的所有參照,VirtualizationService
會自動關閉 VM。這表示如果啟動 VM 的用戶端遭低記憶體終結者關閉,VM 也會關閉,避免資源洩漏。
每個 VM 都由專屬的 crosvm 執行個體管理,而該執行個體會代表用戶端進行管理。VirtualizationService
VirtualizationService
會視需要啟動這些 crosvm 子程序,並分配全域資源 (包括 VirtualizationServiceInternal
在 virtualizationservice
中授予的 CID),然後將 VM 需要的映像檔檔案描述元傳遞給這些程序。VirtualizationService
virtmgr
VirtualizationService
接著會監控子程序何時終止,以便相應地通知任何剩餘的用戶端。
VM packaging
crosvm 支援兩種不同的 VM 啟動方式:提供核心和 initrd,或提供開機載入程式。無論是哪種情況,您也可以提供任意數量的磁碟映像檔,這些映像檔可以是原始映像檔,也可以是多個分割區的組合。客戶會以檔案描述元的形式提供各種圖片。
VirtualizationService
會視需要建構複合磁碟映像檔。這是必要程序,因為複合磁碟檔案會在內部參照組成磁碟的各種分割區映像檔,這些檔案是由用戶端傳遞,可能無法由 crosvm 直接存取。為解決這個問題,VirtualizationService
可確保 crosvm 繼承的檔案描述元編號,與 VirtualizationService
用於建立複合圖片的檔案描述元編號相同。複合磁碟映像檔會使用 /proc/self/fd/N
形式的檔案名稱,代表每個分割區檔案。
對於 Microdroid pVM,AVF 包含開機載入程式,可按照標準 Android 驗證開機流程,從複合磁碟映像檔的分區載入核心。
VM Socket (vsock)
pVM 之間的通訊主要介面是 vsock,這是標準的 virtio Socket 介面。每個 VM 都會由 32 位元內容 ID (CID) 識別,這類似於 IP 位址,VirtualizationServiceInternal
會在 VM VirtualizationService
建立時指派給 VM,並可透過 VM 選擇的任何連接埠號碼公開服務。VM 執行時,CID 是不重複的,但如果 VM 終止,且所有指向 VM 的 IVirtualMachine
繫結控制代碼都已捨棄,CID 值就會回收。
偵錯介面
vm
指令僅供偵錯。開發人員可透過這個指令從殼層啟動 VM、查看記錄,以及終止 VM。透過 vm
指令或 AVF 提供的其他介面,VM 可以啟動可偵錯 (FULL) 或不可偵錯 (NONE) 模式。使用可偵錯的 VM,您可以查看作業系統層級的記錄、存取 ADB 殼層,以及擷取當機傾印或應用程式有效負載。建議在正式環境中使用無法偵錯的 VM。如要進一步瞭解指令列工具和 AVF 提供的其他偵錯介面,請參閱 debug/README.md。