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