| # 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. |