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)
}