adb_client/device/commands/
install.rs

1use std::{fs::File, path::Path};
2
3use crate::{
4    ADBMessageTransport, Result,
5    device::{MessageWriter, adb_message_device::ADBMessageDevice},
6    utils::check_extension_is_apk,
7};
8
9impl<T: ADBMessageTransport> ADBMessageDevice<T> {
10    pub(crate) fn install(&mut self, apk_path: &dyn AsRef<Path>) -> Result<()> {
11        let mut apk_file = File::open(apk_path)?;
12
13        check_extension_is_apk(apk_path)?;
14
15        let file_size = apk_file.metadata()?.len();
16
17        self.open_session(format!("exec:cmd package 'install' -S {}\0", file_size).as_bytes())?;
18
19        let transport = self.get_transport().clone();
20
21        let mut writer = MessageWriter::new(transport, self.get_local_id()?, self.get_remote_id()?);
22
23        std::io::copy(&mut apk_file, &mut writer)?;
24
25        let final_status = self.get_transport_mut().read_message()?;
26
27        match final_status.into_payload().as_slice() {
28            b"Success\n" => {
29                log::info!(
30                    "APK file {} successfully installed",
31                    apk_path.as_ref().display()
32                );
33                Ok(())
34            }
35            d => Err(crate::RustADBError::ADBRequestFailed(String::from_utf8(
36                d.to_vec(),
37            )?)),
38        }
39    }
40}