Microdroid_manager starts before apexd

Microdroid_manager should verify payloads (APEXes, APK) before anything
else (including apexd reading APEXes, apkdmverity/zipfuse reading APK).

In order to start before apexd, it should be "bootstrap" process (since
it can't rely on any apexes including bionic).

Bug: 190343842
Test: MicrodroidHostTestCases
Change-Id: I682555822fb8f73ea160c4a2ac379549dde35329
diff --git a/microdroid/init.rc b/microdroid/init.rc
index 45d9398..043577d 100644
--- a/microdroid/init.rc
+++ b/microdroid/init.rc
@@ -17,6 +17,7 @@
 
     start ueventd
 
+    start microdroid_manager
     # TODO(b/190343842) verify apexes/apk before mounting them.
 
     # Exec apexd in the VM mode to avoid unnecessary overhead of normal mode.
@@ -81,10 +82,6 @@
 
     start adbd
 
-    # TODO(b/186396070) microdroid_manager starts zipfuse if necessary
-    # TODO(b/186396070) move this before apexd for DICE derivation
-    start microdroid_manager
-
 on load_persist_props_action
     start logd
     start logd-reinit
diff --git a/microdroid_manager/Android.bp b/microdroid_manager/Android.bp
index dabcf31..4ea156a 100644
--- a/microdroid_manager/Android.bp
+++ b/microdroid_manager/Android.bp
@@ -27,6 +27,7 @@
 rust_binary {
     name: "microdroid_manager",
     defaults: ["microdroid_manager_defaults"],
+    bootstrap: true,
 }
 
 rust_test {
diff --git a/microdroid_manager/src/metadata.rs b/microdroid_manager/src/metadata.rs
index 86a9e3e..432a134 100644
--- a/microdroid_manager/src/metadata.rs
+++ b/microdroid_manager/src/metadata.rs
@@ -14,15 +14,19 @@
 
 //! Payload metadata from /dev/block/by-name/payload-metadata
 
+use crate::ioutil;
+
 use anyhow::Result;
 use log::info;
 use microdroid_metadata::{read_metadata, Metadata};
-use std::fs::File;
+use std::time::Duration;
 
+const WAIT_TIMEOUT: Duration = Duration::from_secs(10);
 const PAYLOAD_METADATA_PATH: &str = "/dev/block/by-name/payload-metadata";
 
 /// loads payload metadata from /dev/block/by-name/paylaod-metadata
 pub fn load() -> Result<Metadata> {
     info!("loading payload metadata...");
-    read_metadata(File::open(PAYLOAD_METADATA_PATH)?)
+    let file = ioutil::wait_for_file(PAYLOAD_METADATA_PATH, WAIT_TIMEOUT)?;
+    read_metadata(file)
 }