49 releases (8 stable)

new 1.1.0 Apr 21, 2024
1.0.6 Feb 28, 2024
1.0.2 Jan 29, 2024
0.3.0-alpha6 Jan 23, 2024
0.1.1 Aug 5, 2023

#113 in Hardware support

Download history 15/week @ 2024-01-04 51/week @ 2024-01-11 11/week @ 2024-01-18 7/week @ 2024-01-25 8/week @ 2024-02-01 1/week @ 2024-02-08 483/week @ 2024-02-22 542/week @ 2024-02-29 11/week @ 2024-03-07 6/week @ 2024-03-14 8/week @ 2024-03-28 2/week @ 2024-04-04 158/week @ 2024-04-18

168 downloads per month

MIT license

6MB
6K SLoC

Contains (APK file, 7MB) test_files/app-debug.apk

radb_client

Simple Android adb client for rust.

crates.io

Example


use radb_client::{*};

pub fn main() {
    let adb = Adb::new().unwrap();
    let device_ip = String::from("192.168.1.128");
    let conn = ConnectionType::try_from_ip(device_ip).unwrap();
    let client = Client::try_from(conn).unwrap();

    match client.connect() {
        Ok(()) => println!("Device connected"),
        Err(err) => println!("Error connecting to device: {:?}", err),
    }
}

Using the feature scanner is also possible to scan for all the available devices:

use std::str::FromStr;
use std::time::{Duration, Instant};

use cidr_utils::cidr::Ipv4Cidr;
use cidr_utils::Ipv4CidrSize;
use crossbeam_channel::unbounded;
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
use itertools::Either;

use crate::scanner::Scanner;
use crate::test::test::init_log;
use crate::types::Adb;

fn test_scan() {
    let cidr = Ipv4Cidr::from_str("192.168.1.0/24").unwrap();
    let progress_style = ProgressStyle::with_template(
        "{prefix:.cyan.bold/blue.bold}: {elapsed_precise} [{bar:40.cyan/blue}] {percent:.bold}%. {msg} ",
    )
        .unwrap()
        .progress_chars("=> ");

    let multi_progress = MultiProgress::new();
    let progress = multi_progress.add(ProgressBar::new(cidr.size()));
    progress.set_style(progress_style.clone());
    progress.set_prefix("Scanning");

    let (tx, rx) = unbounded();
    let adb = Adb::new().expect("failed to find adb");

    let scanner = Scanner::default()
        .with_debug(false)
        .with_tcp_timeout(Duration::from_millis(200))
        .with_adb_timeout(Duration::from_millis(100));

    let start = Instant::now();
    scanner.scan(&adb, cidr.iter(), tx.clone());

    drop(tx);

    let mut result = Vec::new();
    for either in rx {
        match either {
            Either::Left(addr) => {
                progress.inc(1);
                progress.set_message(format!("{addr}..."));
            }
            Either::Right(client) => {
                if !result.contains(&client) {
                    result.push(client);
                }
            }
        }
    }
    
    progress.finish_with_message(format!("Scanned {} IPs", cidr.size()));

    let elapsed = start.elapsed();

    println!("Time elapsed for scanning is: {:?}ms", elapsed.as_millis());
    println!("Found {:} devices", result.len());

    result.sort_by_key(|k| k.conn);

    for device in result.iter() {
        println!("{device}");
    }
}

Dependencies

~26–40MB
~525K SLoC