VirtualizationService

VirtualizationService 會管理在 Android 系統上執行的多個訪客 VM (無論是否受保護),主要透過管理 crosvm 的例項。VirtualizationService 會公開 AIDL API,系統服務或應用程式可使用該 API 啟動、監控及停止 VM。如要使用 VirtualizationService,請直接執行 virtmgr,或匯入 javalibrustlib,以便執行 virtmgr 做為子程序。

VM 生命週期

IVirtualMachine 物件會追蹤 VM 的存取情況。只要有至少一個 IVirtualMachine 物件的參照,VM 就會繼續執行 (除非發生當機或自行關機)。如果在 VM 關閉前捨棄 IVirtualMachine 物件的所有參照,則 VirtualizationService 會自動關閉 VM。這個程序表示,如果啟動 VM 的用戶端遭到低記憶體終結器關閉,VM 也會一併關閉,藉此防止資源耗盡。

每個 VM 都由專屬的 crosvm 執行個體管理,而 VirtualizationService 會代表用戶端進行管理。virtmgr 中的 VirtualizationService 會視需要使用已分配的全球資源啟動這些 crosvm 子程序,包括 virtualizationserviceVirtualizationServiceInternal 授予的 CID,並將 VM 所需的映像檔檔案描述項傳遞給這些子程序。VirtualizationService 接著監控子程序的結束時間,以便通知任何剩餘的用戶端。

VM 封裝

crosvm 支援兩種不同的 VM 啟動方式:提供核心和 initrd,或提供 bootloader。無論是哪種情況,您都可以提供任意數量的磁碟映像檔,這些映像檔可能是原始映像檔,也可能是多個分割區的合成映像檔。用戶端會提供各種圖片做為檔案描述符。

VirtualizationService 會視需求建構複合磁碟映像檔。這項程序是必要的,因為複合磁碟檔案會在內部參照組成磁碟的各種分割區映像檔,這些檔案是由用戶端傳遞,可能無法直接由 crosvm 存取。為解決這個問題,VirtualizationService 會確保 crosvm 繼承的檔案描述元資料號碼與 VirtualizationService 用於建立合成圖片的檔案描述元資料號碼相同。複合磁碟映像檔會使用 /proc/self/fd/N 格式的檔案名稱來代表每個分區檔案。

針對 Microdroid pVM,AVF 包含一個引導程式,可按照標準 Android 驗證啟動流程,從複合磁碟映像檔的分區載入核心。

VM 通訊端 (vsock)

pVM 之間通訊的主要介面是 vsock,這是標準的 virtio 網路介面。每個 VM 都有一個 32 位元的內容 ID (CID) 來識別,這類似於 IP 位址。IP 位址 VirtualizationServiceInternalVirtualizationService 建立 VM 時會指派給 VM,而且可在 VM 選擇的任何通訊埠編號公開服務。在 VM 執行期間,CID 是唯一的,但在終止 VM 並放棄所有 VM 的 IVirtualMachine 繫結器句柄時,可以回收 CID 值。

偵錯介面

vm 指令可用於偵錯。這個指令可讓開發人員從 Shell 啟動 VM、查看記錄,以及終止 VM。使用 vm 指令或 AVF 提供的其他介面,VM 可在可偵錯 (FULL) 或不可偵錯 (NONE) 模式下啟動。透過可進行偵錯的 VM,您可以查看 OS 層級的記錄檔、存取 ADB 殼層,以及擷取當機傾印或應用程式酬載。建議您在正式環境中使用無法偵錯的 VM。如要進一步瞭解 AVF 提供的指令列工具和其他偵錯介面,請參閱 debug/README.md