Call odrefresh in VM from composd

composd needs to prepare the directory, run a fd_server, etc. then
request to run odrefresh in the VM.

`FdServerConfig` and `FdServer` are introduced to make starting a
fd_server from composd easier.

Also, add a testing command in composd_cmd.

Bug: 205750213
Test: atest ComposHostTestCases
Test: With some local hacks in ART, with SELinux disabled in the VM,
      odrefresh completed with exit code 80 and output files that
      look normal (at least sizes are).
Change-Id: I52c9d1ad369eea6d423831adb42087a3bcf30d66
diff --git a/compos/composd_cmd/composd_cmd.rs b/compos/composd_cmd/composd_cmd.rs
index 0422b44..e591794 100644
--- a/compos/composd_cmd/composd_cmd.rs
+++ b/compos/composd_cmd/composd_cmd.rs
@@ -37,7 +37,7 @@
             .index(1)
             .takes_value(true)
             .required(true)
-            .possible_values(&["forced-compile-test"]),
+            .possible_values(&["forced-compile-test", "forced-odrefresh"]),
     );
     let args = app.get_matches();
     let command = args.value_of("command").unwrap();
@@ -46,6 +46,7 @@
 
     match command {
         "forced-compile-test" => run_forced_compile_for_test()?,
+        "forced-odrefresh" => run_forced_odrefresh_for_test()?,
         _ => panic!("Unexpected command {}", command),
     }
 
@@ -135,3 +136,11 @@
         }
     }
 }
+
+fn run_forced_odrefresh_for_test() -> Result<()> {
+    let service = wait_for_interface::<dyn IIsolatedCompilationService>("android.system.composd")
+        .context("Failed to connect to composd service")?;
+    let compilation_result = service.startTestOdrefresh().context("Compilation failed")?;
+    println!("odrefresh exit code: {:?}", compilation_result);
+    Ok(())
+}