Run odrefresh in composd
This is far from finished, but it is at least started. This currently
fails when pvm_exec tries to create a vsock; instead it will need to
request one from composd.
Test: adb shell apex/com.android.compos/bin/composd_cmd
Bug: 186126194
Change-Id: Ic193ddd3835be3daf70b15e78c56c0ccb98e7a1f
diff --git a/compos/composd/src/service.rs b/compos/composd/src/service.rs
index 8fe28ec..7fc9ab0 100644
--- a/compos/composd/src/service.rs
+++ b/compos/composd/src/service.rs
@@ -17,10 +17,15 @@
//! Implementation of IIsolatedCompilationService, called from system server when compilation is
//! desired.
+use crate::compos_instance::CompOsInstance;
+use crate::odrefresh;
use android_system_composd::aidl::android::system::composd::IIsolatedCompilationService::{
BnIsolatedCompilationService, IIsolatedCompilationService,
};
-use android_system_composd::binder::{self, BinderFeatures, Interface, Strong};
+use android_system_composd::binder::{self, BinderFeatures, Interface, Status, Strong};
+use anyhow::{bail, Context, Result};
+use log::{error, info};
+use std::ffi::CString;
pub struct IsolatedCompilationService {}
@@ -29,12 +34,35 @@
BnIsolatedCompilationService::new_binder(service, BinderFeatures::default())
}
-impl IsolatedCompilationService {}
-
impl Interface for IsolatedCompilationService {}
impl IIsolatedCompilationService for IsolatedCompilationService {
- fn doSomething(&self) -> binder::Result<()> {
+ fn runForcedCompile(&self) -> binder::Result<()> {
+ to_binder_result(self.do_run_forced_compile())
+ }
+}
+
+fn to_binder_result<T>(result: Result<T>) -> binder::Result<T> {
+ result.map_err(|e| {
+ error!("Returning binder error: {:#}", e);
+ Status::new_service_specific_error(-1, CString::new(format!("{:#}", e)).ok().as_deref())
+ })
+}
+
+impl IsolatedCompilationService {
+ fn do_run_forced_compile(&self) -> Result<()> {
+ info!("runForcedCompile");
+
+ // TODO: Create instance if need be, handle instance failure, prevent
+ // multiple instances running
+ let comp_os = CompOsInstance::start_current_instance().context("Starting CompOS")?;
+
+ let exit_code = odrefresh::run_forced_compile(comp_os.cid())?;
+
+ if exit_code != odrefresh::ExitCode::CompilationSuccess {
+ bail!("Unexpected odrefresh result: {:?}", exit_code);
+ }
+
Ok(())
}
}