| # Custom VM | |
| ## Headless VMs | |
| If your VM is headless (i.e. console in/out is the primary way of interacting | |
| with it), you can spawn it by passing a JSON config file to the | |
| VirtualizationService via the `vm` tool on a rooted AVF-enabled device. If your | |
| device is attached over ADB, you can run: | |
| ```shell | |
| cat > vm_config.json <<EOF | |
| { | |
| "kernel": "/data/local/tmp/kernel", | |
| "initrd": "/data/local/tmp/ramdisk", | |
| "params": "rdinit=/bin/init" | |
| } | |
| EOF | |
| adb root | |
| adb push <kernel> /data/local/tmp/kernel | |
| adb push <ramdisk> /data/local/tmp/ramdisk | |
| adb push vm_config.json /data/local/tmp/vm_config.json | |
| adb shell "/apex/com.android.virt/bin/vm run /data/local/tmp/vm_config.json" | |
| ``` | |
| The `vm` command also has other subcommands for debugging; run | |
| `/apex/com.android.virt/bin/vm help` for details. | |
| # Terminal app | |
| ## Run GUI apps | |
| Click Display button above to enable display. | |
| And then, go back to the terminal, and run GUI apps. | |
| ## Mouse passthrough | |
| There is a button for mouse passthrough in a display activity. With that, external | |
| mouse event is directly delivered to a VM instance. | |
| ## Hardware acceleration | |
| If a device supports gfxstream, a user can enable hardware acceleration in Terminal | |
| app's settings menu. If you want to test in the userdebug device, create | |
| `/sdcard/linux/gfxstream` file, which enables gfxstream for VM. Note: on HSUM | |
| (Headless System User Mode) devices like some tablets and laptops, use the path | |
| `/mnt/user/10/emulated/10/linux/gfxstream` instead. | |
| ## Connect to console via ADB | |
| Run `adb shell vm console` which returns the command to attach console of an existing | |
| VM instance. | |
| ## (Experimental) Use other desktop environment | |
| We recommend a user to use weston with kiosk mode for single-app experience. | |
| If you want to experiment with other desktop environment, please remove the line | |
| including `systemctl --user start weston` in `/usr/local/bin/enable_display` and | |
| `usr/local/bin/enable_gfxstream` to avoid conflict with newly installed display | |
| manager with existing weston. | |
| ## Connect to host Android device with ADB | |
| To establish ADB connection from the VM at terminal app to the host Android | |
| device, check if `adbd` of the host Android device is listening to any vsock | |
| ports in advance. | |
| There are some properties to make `adbd` listening to the vsock port. To check | |
| whether those properties exist or not, connect your Android device with USB by | |
| following instruction at https://developer.android.com/tools/adb#Enabling, and | |
| execute `adb shell getprop | grep adb` on your computer. If execution result | |
| contains one or more lines below, continue to the later steps with the first | |
| `PORT_NUMBER` ordered below. | |
| 1. `[service.adb.listen_addrs]: [vsock:<PORT_NUMBER>]` | |
| 1. `[service.adb.tcp.port]: [<PORT_NUMBER>]` | |
| 1. `[persist.adb.tcp.port]: [<PORT_NUMBER>]` | |
| If none of the properties above is set, execute `adb tcpip <PORT_NUMBER>` on | |
| your computer with picking any new `PORT_NUMBER`, to set the property with that | |
| `PORT_NUMBER` and restart `adbd` with that property. | |
| Then, execute commands below at terminal app to install `adb` and establish ADB | |
| connection. | |
| ```bash | |
| sudo apt update | |
| sudo apt install adb | |
| adb connect vsock:2:<PORT_NUMBER> # 2 is CID of the host Android device | |
| ``` |