Merge "Log to logcat."
diff --git a/apex/Android.bp b/apex/Android.bp
index 50c17f6..fa3806f 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -17,17 +17,20 @@
     arch: {
         arm64: {
             binaries: [
+                "authfs", // TODO(victorhsieh): move to microdroid once we can run the test in VM.
                 "crosvm",
             ],
         },
         x86_64: {
             binaries: [
+                "authfs", // TODO(victorhsieh): move to microdroid once we can run the test in VM.
                 "crosvm",
             ],
         },
     },
     binaries: [
         "assemble_cvd",
+        "fd_server",
         "virtmanager",
         "vm",
     ],
diff --git a/authfs/Android.bp b/authfs/Android.bp
index 9f7be93..4a20a0c 100644
--- a/authfs/Android.bp
+++ b/authfs/Android.bp
@@ -39,11 +39,13 @@
     ],
     bindgen_flags: ["--size_t-is-usize"],
     cflags: ["-D BORINGSSL_NO_CXX"],
+    apex_available: ["com.android.virt"],
 }
 
 rust_binary {
     name: "authfs",
     defaults: ["authfs_defaults"],
+    apex_available: ["com.android.virt"],
 }
 
 rust_test {
diff --git a/authfs/aidl/Android.bp b/authfs/aidl/Android.bp
index 7f3c968..35a3c4a 100644
--- a/authfs/aidl/Android.bp
+++ b/authfs/aidl/Android.bp
@@ -9,6 +9,7 @@
     backend: {
         rust: {
             enabled: true,
+            apex_available: ["com.android.virt"],
         },
     },
 }
diff --git a/authfs/fd_server/Android.bp b/authfs/fd_server/Android.bp
index f12f01f..6f010ce 100644
--- a/authfs/fd_server/Android.bp
+++ b/authfs/fd_server/Android.bp
@@ -13,4 +13,5 @@
         "liblibc",
         "liblog_rust",
     ],
+    apex_available: ["com.android.virt"],
 }
diff --git a/virtmanager/src/aidl.rs b/virtmanager/src/aidl.rs
index 1b3819f..b7595a9 100644
--- a/virtmanager/src/aidl.rs
+++ b/virtmanager/src/aidl.rs
@@ -14,7 +14,7 @@
 
 //! Implementation of the AIDL interface of the Virt Manager.
 
-use crate::config::load_vm_config;
+use crate::config::VmConfig;
 use crate::crosvm::VmInstance;
 use crate::{Cid, FIRST_GUEST_CID};
 use android_system_virtmanager::aidl::android::system::virtmanager::IVirtManager::IVirtManager;
@@ -141,7 +141,7 @@
 /// Start a new VM instance from the given VM config filename. This assumes the VM is not already
 /// running.
 fn start_vm(config_path: &str, cid: Cid) -> binder::Result<VmInstance> {
-    let config = load_vm_config(config_path).map_err(|e| {
+    let config = VmConfig::load(config_path).map_err(|e| {
         error!("Failed to load VM config {}: {:?}", config_path, e);
         StatusCode::BAD_VALUE
     })?;
diff --git a/virtmanager/src/config.rs b/virtmanager/src/config.rs
index c0d23f0..d8cb06f 100644
--- a/virtmanager/src/config.rs
+++ b/virtmanager/src/config.rs
@@ -49,6 +49,13 @@
         }
         Ok(())
     }
+
+    /// Load the configuration for a VM from the given JSON file.
+    pub fn load(path: &str) -> Result<VmConfig, Error> {
+        let file = File::open(path).with_context(|| format!("Failed to open {}", path))?;
+        let buffered = BufReader::new(file);
+        Ok(serde_json::from_reader(buffered)?)
+    }
 }
 
 /// A disk image to be made available to the VM.
@@ -59,10 +66,3 @@
     /// Whether this disk should be writable by the VM.
     pub writable: bool,
 }
-
-/// Load the configuration for the VM with the given ID from a JSON file.
-pub fn load_vm_config(path: &str) -> Result<VmConfig, Error> {
-    let file = File::open(path).with_context(|| format!("Failed to open {}", path))?;
-    let buffered = BufReader::new(file);
-    Ok(serde_json::from_reader(buffered)?)
-}