ตั้งแต่วันที่ 27 มีนาคม 2025 เป็นต้นไป เราขอแนะนำให้ใช้ android-latest-release
แทน aosp-main
เพื่อสร้างและมีส่วนร่วมใน AOSP โปรดดูข้อมูลเพิ่มเติมที่หัวข้อการเปลี่ยนแปลงใน AOSP
VirtualizationService
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
VirtualizationService
จัดการ VM ผู้ใช้หลายราย ไม่ว่าจะได้รับการปกป้องหรือไม่ก็ตาม ที่ทำงานในระบบ Android โดยหลักๆ แล้วจะจัดการอินสแตนซ์ของ crosvm
VirtualizationService
แสดง AIDL API ซึ่งบริการหรือแอปของระบบสามารถใช้เพื่อเริ่ม ตรวจสอบ และหยุด VM หากต้องการใช้ VirtualizationService
ให้เรียกใช้ virtmgr
โดยตรงหรือนําเข้า javalib หรือ rustlib ซึ่งจะเรียกใช้ virtmgr
เป็นกระบวนการย่อย
วงจรการใช้งาน VM
การเข้าถึง VM จะได้รับการติดตามโดยออบเจ็กต์ IVirtualMachine
ตราบใดที่มีการอ้างอิงออบเจ็กต์ IVirtualMachine
อย่างน้อย 1 รายการ VM จะยังคงทำงานต่อไป (เว้นแต่ว่าระบบจะขัดข้องหรือปิดเอง) หากมีการยกเลิกการอ้างอิงออบเจ็กต์ IVirtualMachine
ทั้งหมดก่อนที่ VM จะปิดลง VirtualizationService
จะปิด VM โดยอัตโนมัติ กระบวนการนี้หมายความว่าหากระบบปิดไคลเอ็นต์ที่เริ่ม VM ไว้เนื่องจากหน่วยความจําเหลือน้อย ระบบก็จะปิด VM ด้วย เพื่อป้องกันการรั่วไหลของทรัพยากร
VM แต่ละรายการได้รับการจัดการโดยอินสแตนซ์ crosvm ของตนเอง ซึ่ง VirtualizationService
จะจัดการในนามของลูกค้า VirtualizationService
ใน virtmgr
จะเริ่มต้นกระบวนการย่อย crosvm เหล่านี้ตามที่จำเป็นด้วยทรัพยากรส่วนกลางที่จัดสรรไว้ รวมถึง CID ที่ VirtualizationServiceInternal
ใน virtualizationservice
มอบให้ และส่งตัวบ่งชี้ไฟล์สำหรับอิมเมจที่ VM ต้องการ จากนั้น VirtualizationService
จะตรวจสอบกระบวนการย่อยเมื่อสิ้นสุดการทำงาน เพื่อให้สามารถแจ้งให้ไคลเอ็นต์ที่เหลือทราบได้
การจัดแพ็กเกจ VM
crosvm รองรับการบูต VM ได้ 2 วิธี ได้แก่ ระบุเคอร์เนลและ initrd หรือระบุบูตโหลดเดอร์ ไม่ว่าจะในกรณีใด คุณก็ระบุจำนวนภาพดิสก์แบบไม่จำกัดได้ ซึ่งอาจเป็นภาพดิบหรือภาพรวมของหลายพาร์ติชันก็ได้ ไคลเอ็นต์จะระบุรูปภาพต่างๆ เป็นตัวระบุไฟล์
VirtualizationService
จะสร้างอิมเมจดิสก์คอมโพสิตตามคําขอ ขั้นตอนนี้จําเป็นเนื่องจากไฟล์ดิสก์คอมโพสิตจะอ้างอิงไฟล์ภาพพาร์ติชันต่างๆ ที่ประกอบกันเป็นดิสก์ ซึ่งไคลเอ็นต์ส่งผ่านและ crosvm อาจเข้าถึงโดยตรงไม่ได้ วิธีแก้ปัญหานี้คือการที่ VirtualizationService
ตรวจสอบว่าหมายเลขตัวระบุไฟล์ที่ crosvm รับช่วงมานั้นเหมือนกับหมายเลขตัวระบุไฟล์ที่ VirtualizationService
ใช้ในการสร้างรูปภาพคอมโพสิต รูปภาพดิสก์แบบคอมโพสิตใช้ชื่อไฟล์ในรูป /proc/self/fd/N
เพื่อแสดงไฟล์พาร์ติชันแต่ละไฟล์
สำหรับ pVM ของ Microdroid นั้น AVF จะมี Bootloader ซึ่งจะโหลดเคอร์เนลจากพาร์ติชันของอิมเมจดิสก์คอมโพสิตตามขั้นตอนการบูตที่ผ่านการรับรองมาตรฐานของ Android
Sockets ของ VM (vsock)
อินเทอร์เฟซหลักสำหรับการสื่อสารระหว่าง pVM คือ vsock ซึ่งเป็นอินเทอร์เฟซซ็อกเก็ต virtio มาตรฐาน VM แต่ละรายการจะระบุด้วยตัวระบุบริบท 32 บิต (CID) ซึ่งคล้ายกับที่อยู่ IP ที่ VirtualizationServiceInternal
กำหนดให้กับ VM เมื่อ VirtualizationService
สร้าง VM และสามารถแสดงบริการในหมายเลขพอร์ตที่ VM เลือก
โดย CID จะเป็นค่าที่ไม่ซ้ำกันขณะที่ VM ทำงานอยู่ แต่ระบบจะนำค่า CID มาใช้ซ้ำได้เมื่อ VM สิ้นสุดการทำงานและมีการยกเลิกแฮนเดิล Binder IVirtualMachine
ทั้งหมดไปยัง VM
อินเทอร์เฟซการแก้ไขข้อบกพร่อง
คำสั่ง vm
มีไว้เพื่อการแก้ไขข้อบกพร่อง คำสั่งนี้ช่วยให้นักพัฒนาซอฟต์แวร์เริ่ม VM จากเชลล์ ดูบันทึก และสิ้นสุดการทำงานของ VM ได้ เมื่อใช้vm
คำสั่งหรืออินเทอร์เฟซอื่นๆ ที่ AVF มีให้ VM สามารถเริ่มต้นในโหมดแก้ไขข้อบกพร่องได้ (FULL) หรือแก้ไขข้อบกพร่องไม่ได้ (NONE) เมื่อใช้ VM ที่แก้ไขข้อบกพร่องได้ คุณจะดูบันทึกระดับระบบปฏิบัติการ เข้าถึงเชลล์ ADB และบันทึก Crash Dump หรือเพย์โหลดของแอปได้
เราขอแนะนำให้ใช้ VM ที่แก้ไขข้อบกพร่องไม่ได้ในเวอร์ชันที่ใช้งานจริง ดูข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือบรรทัดคำสั่งและอินเทอร์เฟซการแก้ไขข้อบกพร่องอื่นๆ ที่ AVF มีให้บริการได้ที่ debug/README.md
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-27 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-07-27 UTC"],[],[],null,["# VirtualizationService\n\n`VirtualizationService` manages multiple guest VMs, protected or otherwise,\nrunning on an Android system, primarily by managing instances of crosvm.\n`VirtualizationService` exposes an AIDL API, which system services or apps can\nuse to start, monitor, and stop VMs. To use `VirtualizationService`, execute\n`virtmgr` directly or import [javalib](https://cs.android.com/android/platform/superproject/+/main:packages/modules/Virtualization/javalib/ \"javalib\") or [rustlib](https://cs.android.com/android/platform/superproject/+/main:packages/modules/Virtualization/vmclient/ \"rustlib\") which executes `virtmgr` as\na child process.\n\nVM lifecycle\n------------\n\nAccess to a VM is tracked by the `IVirtualMachine` object. As long as there's\nat least one reference to `IVirtualMachine` object then the VM continues to\nrun (unless it crashes or shuts down of its own accord). If all references to\nthe `IVirtualMachine` object are dropped before the VM shuts down, then\n`VirtualizationService` automatically shuts down the VM. This process implies\nthat if the client that started the VM is shut down by the low memory killer,\nthen the VM is also shut down, thus preventing resource leaks.\n\nEach VM is managed by its own instance of crosvm, which `VirtualizationService`\nin turn manages on behalf of the client. `VirtualizationService` in `virtmgr`\nstarts these crosvm child processes as required with allocated global resources\nincluding the CID granted by `VirtualizationServiceInternal` in\n`virtualizationservice`, and passes them the file descriptors for the images the\nVM needs. `VirtualizationService` then monitors the child process for when they\ndie, so it can notify any remaining clients accordingly.\n\nVM packaging\n------------\n\ncrosvm supports two different ways of booting a VM: either a kernel and initrd\nare provided or a bootloader is provided. In either case, an\narbitrary number of disk images can also be provided, which might be either\na raw image or a composite of several partitions. The various images are\nprovided by the client as file descriptors.\n\n`VirtualizationService` builds composite disk images on demand. This process is\nnecessary because the composite disk file refers internally to the various\npartition image files composing the disk, which are passed by the client and\nmight not be directly accessible by crosvm. To get around this issue,\n`VirtualizationService` ensures that the file descriptor numbers inherited by\ncrosvm are the same as the file descriptor numbers which `VirtualizationService`\nused in creating the composite images. The composite disk image uses filenames\nin the form to `/proc/self/fd/N` to represent each partition file.\n\nFor Microdroid pVMs, AVF includes a bootloader, which loads the kernel from\na partition of a composite disk image, following the standard Android\nVerified Boot flow.\n\nVM Sockets (vsock)\n------------------\n\nThe primary interface for communication between pVMs is vsock, a standard\nvirtio socket interface. Each VM is identified by a 32-bit context identifier\n(CID), which is analogous to an IP address, which\n`VirtualizationServiceInternal` assigns to the VM when `VirtualizationService`\ncreates the VM, and can expose services on whatever port numbers the VM chooses.\nThe CID is unique while the VM is running, but the CID value can be recycled\nwhen the VM is terminated and all the `IVirtualMachine` binder handles to the VM\nhave been dropped.\n\nDebug interface\n---------------\n\nThe `vm` command is provided for debug purposes. This command lets a developer\nstart a VM from the shell, view its logs, and terminate the VM. With the `vm`\ncommand or other interfaces provided by AVF, a VM can start in either\ndebuggable (FULL) or non-debuggable (NONE) mode. With a debuggable VM, you can\nsee OS-level logs, access the ADB shell, and capture crash-dump or app payload.\nIt's recommended to use a non-debuggable VM in production. For more on\nthe command line tool and other debug interfaces that AVF provides, see\n[debug/README.md](https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/modules/Virtualization/docs/debug/README.md \"Debugging protected VMs\")."]]