blob: 03657ed7a1dfa6b3be24db06d48ec9582c1ac95d [file] [log] [blame] [view]
# Getting started with Android Virtualization Framework
## Step 1: Prepare a device
We support the following devices:
* aosp\_panther (Pixel 7)
* aosp\_cheetah (Pixel 7 Pro)
* aosp\_oriole (Pixel 6)
* aosp\_raven (Pixel 6 Pro)
* aosp\_felix (Pixel Fold)
* aosp\_tangorpro (Pixel Tablet)
* aosp\_cf\_x86\_64\_phone (Cuttlefish a.k.a. Cloud Android). Follow [this
instruction](https://source.android.com/docs/setup/create/cuttlefish-use) to
use.
### Note on Pixel 6 and 6 Pro
AVF is shipped in Pixel 6 and 6 Pro, but isn't enabled by default. To enable
it, follow the instructions below:
1. If the device is running Android 13 or earlier, upgrade to Android 14.
1. Once upgraded to Android 14, execute the following command to enable pKVM.
```shell
adb reboot bootloader
fastboot flashing unlock
fastboot oem pkvm enable
fastboot reboot
```
### Note on Cuttlefish
Cuttlefish does not support protected VMs. Only non-protected VMs are
supported.
## Step 2: Build Android image
This step is optional unless you want to build AVF by yourself or try the
in-development version of AVF.
AVF is implemented as an APEX named `com.android.virt`. However, in order for
you to install it to your device (be it Pixel or Cuttlefish), you first need to
re-build the entire Android from AOSP. This is because the official Android
build you have in your device is release-key signed and therefore you can't
install your custom-built AVF APEX to it - because it is test-key signed.
### Pixel
1. [Download](https://source.android.com/docs/setup/download/downloading)
source code from AOSP. Use the `main` branch.
1. [Download](https://developers.google.com/android/blobs-preview) the preview
vendor blob that matches your device.
1. [Build](https://source.android.com/docs/setup/build/building) the `aosp_`
variant of your device. For example, if your device is Pixel 7 (`panther`),
build `aosp_panther`.
1. [Flash](https://source.android.com/docs/setup/build/running) the built
images to the device.
### Cuttlefish
1. [Download](https://source.android.com/docs/setup/download/downloading)
source code from AOSP. Use the `main` branch.
1. Build Cuttlefish:
```shell
source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
m
```
1. Run Cuttlefish:
```shell
cvd start
```
## Step 3: Build AVF
Then you can repeat building and installing AVF to the device as follows:
1. Build the AVF APEX.
```sh
banchan com.android.virt aosp_arm64
UNBUNDLED_BUILD_SDKS_FROM_SOURCE=true m apps_only dist
```
Replace `aosp_arm64` with `aosp_x86_64` if you are building for Cuttlefish.
1. Install the AVF APEX to the device.
```sh
adb install out/dist/com.android.virt.apex
adb reboot; adb wait-for-device
```
## Step 4: Run a Microdroid VM
[Microdroid](../../build/microdroid/README.md) is a lightweight version of Android
that is intended to run on pVM. You can run a Microdroid-based VM with an empty
payload using the following command:
```shell
packages/modules/Virtualization/vm/vm_shell.sh start-microdroid --auto-connect -- --protected
```
You will see the log messages like the below.
```
found path /apex/com.android.virt/app/EmptyPayloadAppGoogle@MASTER/EmptyPayloadAppGoogle.apk
creating work dir /data/local/tmp/microdroid/7CI6QtktSluD3OZgv
apk.idsig path: /data/local/tmp/microdroid/7CI6QtktSluD3OZgv/apk.idsig
instance.img path: /data/local/tmp/microdroid/7CI6QtktSluD3OZgv/instance.img
Created VM from "/apex/com.android.virt/app/EmptyPayloadAppGoogle@MASTER/EmptyPayloadAppGoogle.apk"!PayloadConfig(VirtualMachinePayloadConfig { payloadBinaryName: "MicrodroidEmptyPayloadJniLib.so" }) with CID 2052, state is STARTING.
[2023-07-07T14:50:43.420766770+09:00 INFO crosvm] crosvm started.
[2023-07-07T14:50:43.422545090+09:00 INFO crosvm] CLI arguments parsed.
[2023-07-07T14:50:43.440984015+09:00 INFO crosvm::crosvm::sys::unix::device_helpers] Trying to attach block device: /proc/self/fd/49
[2023-07-07T14:50:43.441730922+09:00 INFO crosvm::crosvm::sys::unix::device_helpers] Trying to attach block device: /proc/self/fd/54
[2023-07-07T14:50:43.462055141+09:00 INFO crosvm::crosvm::sys::unix::device_helpers] Trying to attach block device: /proc/self/fd/63
[WARN] Config entry DebugPolicy uses non-zero offset with zero size
[WARN] Config entry DebugPolicy uses non-zero offset with zero size
[INFO] pVM firmware
avb_slot_verify.c:443: ERROR: initrd_normal: Hash of data does not match digest in descriptor.
[INFO] device features: SEG_MAX | RO | BLK_SIZE | RING_EVENT_IDX | VERSION_1 | ACCESS_PLATFORM
[INFO] config: 0x201a000
[INFO] found a block device of size 50816KB
[INFO] device features: SEG_MAX | BLK_SIZE | FLUSH | DISCARD | WRITE_ZEROES | RING_EVENT_IDX | VERSION_1 | ACCESS_PLATFORM
[INFO] config: 0x2022000
[INFO] found a block device of size 10304KB
[INFO] No debug policy found.
[INFO] Starting payload...
<omitted>
07-07 05:52:01.322 69 69 I vm_payload: vm_payload: Notified host payload ready successfully
07-07 05:52:01.364 70 70 I adbd : persist.adb.watchdog set to ''
07-07 05:52:01.364 70 70 I adbd : persist.sys.test_harness set to ''
07-07 05:52:01.365 70 70 I adbd : adb watchdog timeout set to 600 seconds
07-07 05:52:01.366 70 70 I adbd : Setup mdns on port= 5555
07-07 05:52:01.366 70 70 I adbd : adbd listening on vsock:5555
07-07 05:52:01.366 70 70 I adbd : adbd started
#
```
The `--auto-connect` option provides you an adb-shell connection to the VM. The
shell promot (`#`) at the end of the log is for that.
## Step 5: Run tests
There are various tests that spawn guest VMs and check different aspects of the
architecture. They all can run via `atest`.
```shell
atest MicrodroidHostTestCases
atest MicrodroidTestApp
```
If you run into problems, inspect the logs produced by `atest`. Their location
is printed at the end. The `host_log_*.zip` file should contain the output of
individual commands as well as VM logs.