#adb #android #tcp #usb

adb_client

Rust ADB (Android Debug Bridge) client library

32 releases (16 stable)

2.1.0 Dec 18, 2024
2.0.5 Nov 18, 2024
1.0.7 Sep 28, 2024
1.0.3 Jul 13, 2024
0.1.5 Jan 23, 2022

#81 in Debugging

Download history 219/week @ 2024-09-23 50/week @ 2024-09-30 19/week @ 2024-10-07 18/week @ 2024-10-14 194/week @ 2024-10-21 148/week @ 2024-10-28 217/week @ 2024-11-04 180/week @ 2024-11-11 331/week @ 2024-11-18 100/week @ 2024-11-25 88/week @ 2024-12-02 50/week @ 2024-12-09 188/week @ 2024-12-16 65/week @ 2024-12-23 53/week @ 2024-12-30 47/week @ 2025-01-06

359 downloads per month
Used in adb_cli

MIT license

170KB
4K SLoC

adb_client

MIT licensed Documentation Crates.io Total Downloads

Rust library implementing ADB protocol.

Installation

Add adb_client crate as a dependency by simply adding it to your Cargo.toml:

[dependencies]
adb_client = "*"

Benchmarks

Benchmarks run on v2.0.6, on a Samsung S10 SM-G973F device and an Intel i7-1265U CPU laptop

ADBServerDevice push vs adb push

ADBServerDevice performs all operations by using adb server as a bridge.

File size Sample size ADBServerDevice adb Difference
10 MB 100 350,79 ms 356,30 ms
-1,57 %
500 MB 50 15,60 s 15,64 s
-0,25 %
1 GB 20 31,09 s 31,12 s
-0,10 %

Examples

Get available ADB devices

use adb_client::ADBServer;
use std::net::{SocketAddrV4, Ipv4Addr};

// A custom server address can be provided
let server_ip = Ipv4Addr::new(127, 0, 0, 1);
let server_port = 5037;

let mut server = ADBServer::new(SocketAddrV4::new(server_ip, server_port));
server.devices();

Using ADB server as bridge

Launch a command on device

use adb_client::{ADBServer, ADBDeviceExt};

let mut server = ADBServer::default();
let mut device = server.get_device().expect("cannot get device");
device.shell_command(&["df", "-h"], &mut std::io::stdout());

Push a file to the device

use adb_client::ADBServer;
use std::net::Ipv4Addr;
use std::fs::File;
use std::path::Path;

let mut server = ADBServer::default();
let mut device = server.get_device().expect("cannot get device");
let mut input = File::open(Path::new("/tmp/f")).expect("Cannot open file");
device.push(&mut input, "/data/local/tmp");

Interact directly with end devices

(USB) Launch a command on device

use adb_client::{ADBUSBDevice, ADBDeviceExt};

let vendor_id = 0x04e8;
let product_id = 0x6860;
let mut device = ADBUSBDevice::new(vendor_id, product_id).expect("cannot find device");
device.shell_command(&["df", "-h"], &mut std::io::stdout());

(USB) Push a file to the device

use adb_client::{ADBUSBDevice, ADBDeviceExt};
use std::fs::File;
use std::path::Path;

let vendor_id = 0x04e8;
let product_id = 0x6860;
let mut device = ADBUSBDevice::new(vendor_id, product_id).expect("cannot find device");
let mut input = File::open(Path::new("/tmp/f")).expect("Cannot open file");
device.push(&mut input, &"/data/local/tmp");

(TCP) Get a shell from device

use std::net::{SocketAddr, IpAddr, Ipv4Addr};
use adb_client::{ADBTcpDevice, ADBDeviceExt};

let device_ip = IpAddr::V4(Ipv4Addr::new(192, 168, 0, 10));
let device_port = 43210;
let mut device = ADBTcpDevice::new(SocketAddr::new(device_ip, device_port)).expect("cannot find device");
device.shell(&mut std::io::stdin(), Box::new(std::io::stdout()));

Dependencies

~22–49MB
~888K SLoC