adb_client/server_device/commands/
install.rs1use 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 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}