Run zipfuse in microdroid

zipfuse now runs in microdroid as a service. The source zip file path
and the mount point are fixed to /dev/block/by-name/microdroid-apk and
/mnt/apk, respectively.

To support that, microdroid_payload.json is amended to add
MicrodroidTestAppk.apk to the payload.img file. This eventually should
be done dynamically by the virt manager.

Bug: 186377508
Test: atest MicrodroidHostTestCases
Change-Id: I7a031ad442995dbd3cdc00a51a0e939c1589a7b2
diff --git a/microdroid/init.rc b/microdroid/init.rc
index f9ed986..3c46501 100644
--- a/microdroid/init.rc
+++ b/microdroid/init.rc
@@ -37,6 +37,9 @@
     # Generate linker config based on apex mounted in bootstrap namespace
     update_linker_config
 
+    mkdir /mnt/apk 0755 system system
+    start zipfuse
+
 on init
     # Mount binderfs
     mkdir /dev/binderfs
diff --git a/microdroid/microdroid_file_contexts b/microdroid/microdroid_file_contexts
index 6d36e7c..369c700 100644
--- a/microdroid/microdroid_file_contexts
+++ b/microdroid/microdroid_file_contexts
@@ -366,6 +366,7 @@
 /system/bin/migrate_legacy_obb_data\.sh u:object_r:migrate_legacy_obb_data_exec:s0
 /system/bin/android\.frameworks\.automotive\.display@1\.0-service u:object_r:automotive_display_service_exec:s0
 /system/bin/snapuserd            u:object_r:snapuserd_exec:s0
+/system/bin/zipfuse              u:object_r:zipfuse_exec:s0
 
 #############################
 # Vendor files
diff --git a/microdroid/microdroid_payload.json b/microdroid/microdroid_payload.json
index c5c49d0..287aabd 100644
--- a/microdroid/microdroid_payload.json
+++ b/microdroid/microdroid_payload.json
@@ -2,5 +2,9 @@
   "system_apexes": [
     "com.android.adbd",
     "com.android.sdkext"
-  ]
-}
\ No newline at end of file
+  ],
+  "apk": {
+    "name": "com.android.microdroid.test",
+    "path": "/apex/com.android.virt/app/MicrodroidTestApp/MicrodroidTestApp.apk"
+  }
+}
diff --git a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
index 5958480..9419541 100644
--- a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
+++ b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
@@ -16,6 +16,7 @@
 
 package android.virt.test;
 
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
@@ -170,8 +171,16 @@
                 is("MicrodroidTest"));
 
         assertThat(
-                executeCommandOnMicrodroid("shell ls /system/bin/zipfuse"),
-                is("/system/bin/zipfuse"));
+                executeCommandOnMicrodroid("shell ls /dev/block/by-name/microdroid-apk"),
+                is("/dev/block/by-name/microdroid-apk"));
+
+        assertThat(
+                executeCommandOnMicrodroid("shell mount"),
+                containsString("zipfuse on /mnt/apk type fuse.zipfuse"));
+
+        assertThat(
+                executeCommandOnMicrodroid("shell ls /mnt/apk/classes.dex"),
+                is("/mnt/apk/classes.dex"));
 
         // Shutdown microdroid
         executeCommand("adb -s localhost:" + TEST_VM_ADB_PORT + " shell reboot");
diff --git a/zipfuse/Android.bp b/zipfuse/Android.bp
index 845508c..24cfaa0 100644
--- a/zipfuse/Android.bp
+++ b/zipfuse/Android.bp
@@ -26,6 +26,7 @@
 rust_binary {
     name: "zipfuse",
     defaults: ["zipfuse.defaults"],
+    init_rc: ["zipfuse.rc"],
 }
 
 rust_test {
diff --git a/zipfuse/zipfuse.rc b/zipfuse/zipfuse.rc
new file mode 100644
index 0000000..97306ea
--- /dev/null
+++ b/zipfuse/zipfuse.rc
@@ -0,0 +1,2 @@
+service zipfuse /system/bin/zipfuse /dev/block/by-name/microdroid-apk /mnt/apk
+    disabled