Skip to main content

adb_client/server_device/commands/
install.rs

1use std::{fs::File, io::Read, path::Path};
2
3use crate::{
4    Result,
5    models::{ADBCommand, ADBLocalCommand},
6    server_device::ADBServerDevice,
7    utils::check_extension_is_apk,
8};
9
10impl ADBServerDevice {
11    /// Install an APK on device
12    pub fn install<P: AsRef<Path>>(&mut self, apk_path: P, user: Option<&str>) -> Result<()> {
13        let mut apk_file = File::open(&apk_path)?;
14
15        check_extension_is_apk(&apk_path)?;
16
17        let file_size = apk_file.metadata()?.len();
18
19        self.set_serial_transport()?;
20
21        self.transport
22            .send_adb_request(&ADBCommand::Local(ADBLocalCommand::Install(
23                file_size,
24                user.map(ToString::to_string),
25            )))?;
26
27        let mut raw_connection = self.transport.get_raw_connection()?;
28
29        std::io::copy(&mut apk_file, &mut raw_connection)?;
30
31        let mut data = [0; 1024];
32        let read_amount = self.transport.get_raw_connection()?.read(&mut data)?;
33
34        match &data[0..read_amount] {
35            b"Success\n" => {
36                log::info!(
37                    "APK file {} successfully installed",
38                    apk_path.as_ref().display()
39                );
40                Ok(())
41            }
42            d => Err(crate::RustADBError::ADBRequestFailed(String::from_utf8(
43                d.to_vec(),
44            )?)),
45        }
46    }
47}