Use qcow2 for data partition

Rather than allocating huge spaces for all VM userdata images, VMs will
use qcow2 to minimize host device's space consumption.

Bug: 185767624
Test: follow README.md
Test: atest MicrodroidHostTestCases
Change-Id: Ib0e7a57d7c5e552a308622312ee0089a8024cf00
diff --git a/microdroid/README.md b/microdroid/README.md
index 4adf60d..a33e0cb 100644
--- a/microdroid/README.md
+++ b/microdroid/README.md
@@ -34,13 +34,14 @@
 $ adb shell 'cp /apex/com.android.virt/etc/fs/*.img /data/local/tmp'
 $ adb shell 'cp /apex/com.android.virt/etc/uboot_env.img /data/local/tmp'
 $ adb shell 'dd if=/dev/zero of=/data/local/tmp/misc.img bs=4k count=256'
-$ adb shell 'dd if=/dev/zero of=/data/local/tmp/userdata.img bs=4k count=25600'
+$ adb shell 'dd if=/dev/zero of=/data/local/tmp/userdata.img bs=1 count=0 seek=4G'
 $ adb shell 'mkfs.ext4 /data/local/tmp/userdata.img'
 $ adb shell 'cd /data/local/tmp; /apex/com.android.virt/bin/mk_cdisk /apex/com.android.virt/etc/microdroid_cdisk.json os_composite.img'
 $ adb shell 'cd /data/local/tmp; /apex/com.android.virt/bin/mk_cdisk /apex/com.android.virt/etc/microdroid_cdisk_env.json env_composite.img'
 $ adb shell 'cd /data/local/tmp; /apex/com.android.virt/bin/mk_cdisk /apex/com.android.virt/etc/microdroid_cdisk_userdata.json userdata_composite.img'
+$ adb shell 'cd /data/local/tmp; /apex/com.android.virt/bin/crosvm create_qcow2 --backing_file=userdata_composite.img userdata_composite.qcow2'
 $ adb shell 'cd /data/local/tmp; /apex/com.android.virt/bin/mk_payload /apex/com.android.virt/etc/microdroid_payload.json payload.img'
-$ adb shell 'cd /data/local/tmp; /apex/com.android.virt/bin/crosvm run --cid=5 --disable-sandbox --bios=bootloader --serial=type=stdout --disk=os_composite.img --disk=env_composite.img --disk=payload.img --rwdisk=userdata_composite.img'
+$ adb shell 'cd /data/local/tmp; /apex/com.android.virt/bin/crosvm run --cid=5 --disable-sandbox --bios=bootloader --serial=type=stdout --disk=os_composite.img --disk=env_composite.img --disk=payload.img --rwdisk=userdata_composite.qcow2'
 ```
 
 The CID in `--cid` parameter can be anything greater than 2 (`VMADDR_CID_HOST`).
diff --git a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
index 5a104d1..a7cc06c 100644
--- a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
+++ b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
@@ -65,7 +65,7 @@
                                 + "cp %setc/fs/*.img . && "
                                 + "cp %setc/uboot_env.img . && "
                                 + "dd if=/dev/zero of=misc.img bs=4k count=256 && "
-                                + "dd if=/dev/zero of=userdata.img bs=4k count=25600 && "
+                                + "dd if=/dev/zero of=userdata.img bs=1 count=0 seek=4G && "
                                 + "mkfs.ext4 userdata.img",
                         TEST_ROOT, TEST_ROOT, VIRT_APEX, VIRT_APEX, VIRT_APEX);
         getDevice().executeShellCommand(prepareImagesCmd);
@@ -87,6 +87,12 @@
                                 + " userdata_composite.img",
                         TEST_ROOT, VIRT_APEX, VIRT_APEX);
         getDevice().executeShellCommand(makeDataCompositeCmd);
+        String makeDataCompositeQcow2Cmd =
+                String.format(
+                        "cd %s; %sbin/crosvm create_qcow2 --backing_file=userdata_composite.img"
+                                + " userdata_composite.qcow2",
+                        TEST_ROOT, VIRT_APEX);
+        getDevice().executeShellCommand(makeDataCompositeQcow2Cmd);
         String makePayloadCompositeCmd =
                 String.format(
                         "cd %s; %sbin/mk_payload %setc/microdroid_payload.json payload.img",
@@ -99,7 +105,7 @@
                         Arrays.asList(
                                 TEST_ROOT + "/os_composite.img",
                                 TEST_ROOT + "/env_composite.img",
-                                TEST_ROOT + "/userdata_composite.img",
+                                TEST_ROOT + "/userdata_composite.qcow2",
                                 TEST_ROOT + "/payload.img"));
         CommandResult result =
                 getDevice().executeShellV2Command("du -b " + String.join(" ", compositeImages));
@@ -113,7 +119,7 @@
                         "cd %s; %sbin/crosvm run --cid=%d --disable-sandbox --bios=bootloader"
                                 + " --serial=type=syslog --disk=os_composite.img"
                                 + " --disk=env_composite.img --disk=payload.img"
-                                + " --rwdisk=userdata_composite.img",
+                                + " --rwdisk=userdata_composite.qcow2",
                         TEST_ROOT, VIRT_APEX, TEST_VM_CID);
         executor.execute(
                 () -> {