Compare commits
8 Commits
bump-versi
...
v2.1.15
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0732a0bbad | ||
|
|
b5673001ca | ||
|
|
81829c1523 | ||
|
|
b9d2b8374f | ||
|
|
5716784f5d | ||
|
|
b6ddc720d8 | ||
|
|
5438e53361 | ||
|
|
39a7f0a8cf |
@@ -9,7 +9,7 @@ homepage = "https://github.com/cocool97/adb_client"
|
|||||||
keywords = ["adb", "android", "tcp", "usb"]
|
keywords = ["adb", "android", "tcp", "usb"]
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://github.com/cocool97/adb_client"
|
repository = "https://github.com/cocool97/adb_client"
|
||||||
version = "2.1.13"
|
version = "2.1.15"
|
||||||
|
|
||||||
# To build locally when working on a new release
|
# To build locally when working on a new release
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ base64 = { version = "0.22.1" }
|
|||||||
bincode = { version = "1.3.3" }
|
bincode = { version = "1.3.3" }
|
||||||
byteorder = { version = "1.5.0" }
|
byteorder = { version = "1.5.0" }
|
||||||
chrono = { version = "0.4.40", default-features = false, features = ["std"] }
|
chrono = { version = "0.4.40", default-features = false, features = ["std"] }
|
||||||
homedir = { version = "0.3.4" }
|
homedir = { version = "= 0.3.4" }
|
||||||
image = { version = "0.25.5", default-features = false }
|
image = { version = "0.25.5", default-features = false }
|
||||||
log = { version = "0.4.26" }
|
log = { version = "0.4.26" }
|
||||||
mdns-sd = { version = "0.13.9", default-features = false, features = [
|
mdns-sd = { version = "0.13.9", default-features = false, features = [
|
||||||
@@ -40,7 +40,7 @@ thiserror = { version = "2.0.7" }
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
anyhow = { version = "1.0.93" }
|
anyhow = { version = "1.0.93" }
|
||||||
criterion = { version = "0.5.1" } # Used for benchmarks
|
criterion = { version = "0.6.0" } # Used for benchmarks
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
harness = false
|
harness = false
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ pub fn read_adb_private_key<P: AsRef<Path>>(private_key_path: P) -> Result<Optio
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Search for adb devices with known interface class and subclass values
|
/// Search for adb devices with known interface class and subclass values
|
||||||
fn search_adb_devices() -> Result<Option<(u16, u16)>> {
|
pub fn search_adb_devices() -> Result<Option<(u16, u16)>> {
|
||||||
let mut found_devices = vec![];
|
let mut found_devices = vec![];
|
||||||
for device in rusb::devices()?.iter() {
|
for device in rusb::devices()?.iter() {
|
||||||
let Ok(des) = device.device_descriptor() else {
|
let Ok(des) = device.device_descriptor() else {
|
||||||
@@ -57,7 +57,8 @@ fn search_adb_devices() -> Result<Option<(u16, u16)>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_adb_device<T: UsbContext>(device: &Device<T>, des: &DeviceDescriptor) -> bool {
|
/// Check whether a device with given descriptor is an ADB device
|
||||||
|
pub fn is_adb_device<T: UsbContext>(device: &Device<T>, des: &DeviceDescriptor) -> bool {
|
||||||
const ADB_SUBCLASS: u8 = 0x42;
|
const ADB_SUBCLASS: u8 = 0x42;
|
||||||
const ADB_PROTOCOL: u8 = 0x1;
|
const ADB_PROTOCOL: u8 = 0x1;
|
||||||
|
|
||||||
@@ -180,6 +181,11 @@ impl ADBUSBDevice {
|
|||||||
self.get_transport_mut().write_message(message)?;
|
self.get_transport_mut().write_message(message)?;
|
||||||
|
|
||||||
let message = self.get_transport_mut().read_message()?;
|
let message = self.get_transport_mut().read_message()?;
|
||||||
|
// If the device returned CNXN instead of AUTH it does not require authentication,
|
||||||
|
// so we can skip the auth steps.
|
||||||
|
if message.header().command() == MessageCommand::Cnxn {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
message.assert_command(MessageCommand::Auth)?;
|
message.assert_command(MessageCommand::Auth)?;
|
||||||
|
|
||||||
// At this point, we should have receive an AUTH message with arg0 == 1
|
// At this point, we should have receive an AUTH message with arg0 == 1
|
||||||
|
|||||||
@@ -35,10 +35,10 @@ impl<T: ADBMessageTransport> Write for MessageWriter<T> {
|
|||||||
Ok(response) => {
|
Ok(response) => {
|
||||||
response
|
response
|
||||||
.assert_command(MessageCommand::Okay)
|
.assert_command(MessageCommand::Okay)
|
||||||
.map_err(|e| Error::new(ErrorKind::Other, e))?;
|
.map_err(Error::other)?;
|
||||||
Ok(buf.len())
|
Ok(buf.len())
|
||||||
}
|
}
|
||||||
Err(e) => Err(Error::new(ErrorKind::Other, e)),
|
Err(e) => Err(Error::other(e)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ mod shell_message_writer;
|
|||||||
use adb_message_device::ADBMessageDevice;
|
use adb_message_device::ADBMessageDevice;
|
||||||
pub use adb_tcp_device::ADBTcpDevice;
|
pub use adb_tcp_device::ADBTcpDevice;
|
||||||
pub use adb_transport_message::{ADBTransportMessage, ADBTransportMessageHeader};
|
pub use adb_transport_message::{ADBTransportMessage, ADBTransportMessageHeader};
|
||||||
pub use adb_usb_device::{ADBUSBDevice, get_default_adb_key_path};
|
pub use adb_usb_device::{
|
||||||
|
ADBUSBDevice, get_default_adb_key_path, is_adb_device, search_adb_devices,
|
||||||
|
};
|
||||||
pub use message_writer::MessageWriter;
|
pub use message_writer::MessageWriter;
|
||||||
pub use models::{ADBRsaKey, MessageCommand, MessageSubcommand};
|
pub use models::{ADBRsaKey, MessageCommand, MessageSubcommand};
|
||||||
pub use shell_message_writer::ShellMessageWriter;
|
pub use shell_message_writer::ShellMessageWriter;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ mod transports;
|
|||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
pub use adb_device_ext::ADBDeviceExt;
|
pub use adb_device_ext::ADBDeviceExt;
|
||||||
pub use device::{ADBTcpDevice, ADBUSBDevice};
|
pub use device::{ADBTcpDevice, ADBUSBDevice, is_adb_device, search_adb_devices};
|
||||||
pub use emulator_device::ADBEmulatorDevice;
|
pub use emulator_device::ADBEmulatorDevice;
|
||||||
pub use error::{Result, RustADBError};
|
pub use error::{Result, RustADBError};
|
||||||
pub use mdns::*;
|
pub use mdns::*;
|
||||||
|
|||||||
@@ -42,18 +42,15 @@ impl<R: Read> Read for ADBRecvCommandReader<R> {
|
|||||||
let mut error_msg = vec![0; length];
|
let mut error_msg = vec![0; length];
|
||||||
self.inner.read_exact(&mut error_msg)?;
|
self.inner.read_exact(&mut error_msg)?;
|
||||||
|
|
||||||
Err(std::io::Error::new(
|
Err(std::io::Error::other(format!(
|
||||||
std::io::ErrorKind::Other,
|
"ADB request failed: {}",
|
||||||
format!(
|
String::from_utf8_lossy(&error_msg)
|
||||||
"ADB request failed: {}",
|
)))
|
||||||
String::from_utf8_lossy(&error_msg)
|
|
||||||
),
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
_ => Err(std::io::Error::new(
|
_ => Err(std::io::Error::other(format!(
|
||||||
std::io::ErrorKind::Other,
|
"Unknown response from device {:#?}",
|
||||||
format!("Unknown response from device {:#?}", header),
|
header
|
||||||
)),
|
))),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Computing minimum to ensure to stop reading before next header...
|
// Computing minimum to ensure to stop reading before next header...
|
||||||
|
|||||||
@@ -21,6 +21,6 @@ name = "stub_gen"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
adb_client = { path = "../adb_client" }
|
adb_client = { path = "../adb_client" }
|
||||||
anyhow = { version = "1.0.95" }
|
anyhow = { version = "1.0.95" }
|
||||||
pyo3 = { version = "0.24.1", features = ["abi3-py37", "anyhow"] }
|
pyo3 = { version = "0.25.0", features = ["abi3-py37", "anyhow"] }
|
||||||
pyo3-stub-gen = "0.7.0"
|
pyo3-stub-gen = "0.7.0"
|
||||||
pyo3-stub-gen-derive = "0.7.0"
|
pyo3-stub-gen-derive = "0.7.0"
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ usb_device.push("file.txt", "/data/local/tmp/file.txt")
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Create Python virtual environment
|
# Create Python virtual environment
|
||||||
cd pyadb_client
|
|
||||||
python3 -m venv .venv
|
python3 -m venv .venv
|
||||||
source .venv/bin/activate
|
source .venv/bin/activate
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user