Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented uninstall command #86

Merged
merged 2 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion adb_cli/src/adb_termios.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ impl Drop for ADBTermios {
fn drop(&mut self) {
// Custom drop implementation, restores previous termios structure.
if let Err(e) = tcsetattr(self.fd, TCSANOW, &self.old_termios) {
log::error!("Error while droping ADBTermios: {e}")
log::error!("Error while dropping ADBTermios: {e}")
}
}
}
4 changes: 4 additions & 0 deletions adb_cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ fn main() -> Result<()> {
log::info!("Starting installation of APK {}...", path.display());
device.install(&path)?;
}
DeviceCommands::Uninstall { package } => {
log::info!("Uninstalling the package {}...", package);
device.uninstall(&package)?;
}
DeviceCommands::Framebuffer { path } => {
device.framebuffer(&path)?;
log::info!("Successfully dumped framebuffer at path {path}");
Expand Down
5 changes: 5 additions & 0 deletions adb_cli/src/models/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ pub enum DeviceCommands {
/// Path to APK file. Extension must be ".apk"
path: PathBuf,
},
/// Uninstall a package from the device
Uninstall {
/// Name of the package to uninstall
package: String,
},
/// Dump framebuffer of device
Framebuffer {
/// Framebuffer image destination path
Expand Down
3 changes: 3 additions & 0 deletions adb_client/src/adb_device_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ pub trait ADBDeviceExt {
/// Install an APK pointed to by `apk_path` on device.
fn install(&mut self, apk_path: &dyn AsRef<Path>) -> Result<()>;

/// Uninstall the package `package` from device.
fn uninstall(&mut self, package: &str) -> Result<()>;

/// Inner method requesting framebuffer from an Android device
fn framebuffer_inner(&mut self) -> Result<ImageBuffer<Rgba<u8>, Vec<u8>>>;

Expand Down
4 changes: 4 additions & 0 deletions adb_client/src/device/adb_message_device_commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ impl<T: ADBMessageTransport> ADBDeviceExt for ADBMessageDevice<T> {
self.install(apk_path)
}

fn uninstall(&mut self, package: &str) -> Result<()> {
self.uninstall(package)
}

fn framebuffer_inner(&mut self) -> Result<image::ImageBuffer<image::Rgba<u8>, Vec<u8>>> {
self.framebuffer_inner()
}
Expand Down
5 changes: 5 additions & 0 deletions adb_client/src/device/adb_tcp_device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ impl ADBDeviceExt for ADBTcpDevice {
self.inner.install(apk_path)
}

#[inline]
fn uninstall(&mut self, package: &str) -> Result<()> {
self.inner.uninstall(package)
}

#[inline]
fn framebuffer_inner(&mut self) -> Result<image::ImageBuffer<image::Rgba<u8>, Vec<u8>>> {
self.inner.framebuffer_inner()
Expand Down
5 changes: 5 additions & 0 deletions adb_client/src/device/adb_usb_device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,11 @@ impl ADBDeviceExt for ADBUSBDevice {
self.inner.install(apk_path)
}

#[inline]
fn uninstall(&mut self, package: &str) -> Result<()> {
self.inner.uninstall(package)
}

#[inline]
fn framebuffer_inner(&mut self) -> Result<image::ImageBuffer<image::Rgba<u8>, Vec<u8>>> {
self.inner.framebuffer_inner()
Expand Down
1 change: 1 addition & 0 deletions adb_client/src/device/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ mod push;
mod reboot;
mod shell;
mod stat;
mod uninstall;
19 changes: 19 additions & 0 deletions adb_client/src/device/commands/uninstall.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use crate::{device::adb_message_device::ADBMessageDevice, ADBMessageTransport, Result};

impl<T: ADBMessageTransport> ADBMessageDevice<T> {
pub(crate) fn uninstall(&mut self, package_name: &str) -> Result<()> {
self.open_session(format!("exec:cmd package 'uninstall' {}\0", package_name).as_bytes())?;

let final_status = self.get_transport_mut().read_message()?;

match final_status.into_payload().as_slice() {
b"Success\n" => {
log::info!("Package {} successfully uninstalled", package_name);
Ok(())
}
d => Err(crate::RustADBError::ADBRequestFailed(String::from_utf8(
d.to_vec(),
)?)),
}
}
}
4 changes: 4 additions & 0 deletions adb_client/src/models/adb_server_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub(crate) enum AdbServerCommand {
MDNSServices,
ServerStatus,
ReconnectOffline,
Uninstall(String),
Install(u64),
// Local commands
ShellCommand(String),
Expand Down Expand Up @@ -83,6 +84,9 @@ impl Display for AdbServerCommand {
}
AdbServerCommand::Usb => write!(f, "usb:"),
AdbServerCommand::Install(size) => write!(f, "exec:cmd package 'install' -S {size}"),
AdbServerCommand::Uninstall(package) => {
write!(f, "exec:cmd package 'uninstall' {package}")
}
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions adb_client/src/server_device/adb_server_device_commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@ impl ADBDeviceExt for ADBServerDevice {
self.install(apk_path)
}

fn uninstall(&mut self, package: &str) -> Result<()> {
self.uninstall(package)
}

fn framebuffer_inner(&mut self) -> Result<image::ImageBuffer<image::Rgba<u8>, Vec<u8>>> {
self.framebuffer_inner()
}
Expand Down
1 change: 1 addition & 0 deletions adb_client/src/server_device/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ mod send;
mod stat;
mod tcpip;
mod transport;
mod uninstall;
mod usb;
28 changes: 28 additions & 0 deletions adb_client/src/server_device/commands/uninstall.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use std::io::Read;

use crate::{models::AdbServerCommand, server_device::ADBServerDevice, Result};

impl ADBServerDevice {
/// Uninstall a package from device
pub fn uninstall(&mut self, package_name: &str) -> Result<()> {
let serial: String = self.identifier.clone();
self.connect()?
.send_adb_request(AdbServerCommand::TransportSerial(serial))?;

self.transport
.send_adb_request(AdbServerCommand::Uninstall(package_name.to_string()))?;

let mut data = [0; 1024];
let read_amount = self.transport.get_raw_connection()?.read(&mut data)?;

match &data[0..read_amount] {
b"Success\n" => {
log::info!("Package {} successfully uninstalled", package_name);
Ok(())
}
d => Err(crate::RustADBError::ADBRequestFailed(String::from_utf8(
d.to_vec(),
)?)),
}
}
}