Skip to content

Commit 9f75d06

Browse files
authored
fix(cli): adb port forward error handling, add logs, closes #9509 (#10604)
1 parent 39bf0a1 commit 9f75d06

File tree

9 files changed

+80
-10
lines changed

9 files changed

+80
-10
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"tauri-cli": patch:bug
3+
"@tauri-apps/cli": patch:bug
4+
---
5+
6+
Fixes `android dev` port forward failing under some conditions, add better logging and error handling.

tooling/cli/Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tooling/cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ name = "cargo-tauri"
3939
path = "src/main.rs"
4040

4141
[dependencies]
42-
cargo-mobile2 = { version = "0.13.1", default-features = false }
42+
cargo-mobile2 = { version = "0.13.2", default-features = false }
4343
jsonrpsee = { version = "0.24", features = [ "server" ] }
4444
jsonrpsee-core = "0.24"
4545
jsonrpsee-client-transport = { version = "0.24", features = [ "ws" ] }

tooling/cli/src/mobile/android/android_studio_script.rs

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,35 @@ pub fn command(options: Options) -> Result<()> {
8585

8686
if let Some(port) = dev_url.and_then(|url| url.port_or_known_default()) {
8787
let forward = format!("tcp:{port}");
88-
// ignore errors in case we do not have a device available
89-
let _ = adb::adb(&env, ["reverse", &forward, &forward])
90-
.stdin_file(os_pipe::dup_stdin().unwrap())
91-
.stdout_file(os_pipe::dup_stdout().unwrap())
92-
.stderr_capture()
93-
.run();
88+
log::info!("Forwarding port {port} with adb");
89+
90+
let devices = adb::device_list(&env).unwrap_or_default();
91+
92+
// clear port forwarding for all devices
93+
for device in &devices {
94+
remove_adb_reverse(&env, device.serial_no(), &forward);
95+
}
96+
97+
// if there's a known target, we should force use it
98+
if let Some(target_device) = &cli_options.target_device {
99+
run_adb_reverse(&env, &target_device.id, &forward, &forward).with_context(|| {
100+
format!(
101+
"failed to forward port with adb, is the {} device connected?",
102+
target_device.name,
103+
)
104+
})?;
105+
} else if devices.len() == 1 {
106+
let device = devices.first().unwrap();
107+
run_adb_reverse(&env, device.serial_no(), &forward, &forward).with_context(|| {
108+
format!(
109+
"failed to forward port with adb, is the {} device connected?",
110+
device.name(),
111+
)
112+
})?;
113+
} else {
114+
anyhow::bail!("Multiple Android devices are connected ({}), please disconnect devices you do not intend to use so Tauri can determine which to use",
115+
devices.iter().map(|d| d.name()).collect::<Vec<_>>().join(", "));
116+
}
94117
}
95118
}
96119

@@ -152,3 +175,29 @@ fn validate_lib(path: &Path) -> Result<()> {
152175

153176
Ok(())
154177
}
178+
179+
fn run_adb_reverse(
180+
env: &cargo_mobile2::android::env::Env,
181+
device_serial_no: &str,
182+
remote: &str,
183+
local: &str,
184+
) -> std::io::Result<std::process::Output> {
185+
adb::adb(env, ["-s", device_serial_no, "reverse", remote, local])
186+
.stdin_file(os_pipe::dup_stdin().unwrap())
187+
.stdout_file(os_pipe::dup_stdout().unwrap())
188+
.stderr_file(os_pipe::dup_stdout().unwrap())
189+
.run()
190+
}
191+
192+
fn remove_adb_reverse(
193+
env: &cargo_mobile2::android::env::Env,
194+
device_serial_no: &str,
195+
remote: &str,
196+
) {
197+
// ignore errors in case the port is not forwarded
198+
let _ = adb::adb(env, ["-s", device_serial_no, "reverse", "--remove", remote])
199+
.stdin_file(os_pipe::dup_stdin().unwrap())
200+
.stdout_file(os_pipe::dup_stdout().unwrap())
201+
.stderr_file(os_pipe::dup_stdout().unwrap())
202+
.run();
203+
}

tooling/cli/src/mobile/android/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ fn run_build(
202202
noise_level,
203203
vars: Default::default(),
204204
config: build_options.config.clone(),
205+
target_device: None,
205206
};
206207
let handle = write_options(
207208
&tauri_config.lock().unwrap().as_ref().unwrap().identifier,

tooling/cli/src/mobile/android/dev.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
flock,
1515
},
1616
interface::{AppInterface, AppSettings, Interface, MobileOptions, Options as InterfaceOptions},
17-
mobile::{write_options, CliOptions, DevChild, DevProcess},
17+
mobile::{write_options, CliOptions, DevChild, DevProcess, TargetDevice},
1818
ConfigValue, Result,
1919
};
2020
use clap::{ArgAction, Parser};
@@ -233,6 +233,10 @@ fn run_dev(
233233
noise_level,
234234
vars: Default::default(),
235235
config: dev_options.config.clone(),
236+
target_device: device.as_ref().map(|d| TargetDevice {
237+
id: d.serial_no().to_string(),
238+
name: d.name().to_string(),
239+
}),
236240
};
237241

238242
let _handle = write_options(

tooling/cli/src/mobile/ios/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ fn run_build(
284284
noise_level,
285285
vars: Default::default(),
286286
config: build_options.config.clone(),
287+
target_device: None,
287288
};
288289
let handle = write_options(
289290
&tauri_config.lock().unwrap().as_ref().unwrap().identifier,

tooling/cli/src/mobile/ios/dev.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ fn run_dev(
392392
noise_level,
393393
vars: Default::default(),
394394
config: dev_options.config.clone(),
395+
target_device: None,
395396
};
396397
let _handle = write_options(
397398
&tauri_config.lock().unwrap().as_ref().unwrap().identifier,

tooling/cli/src/mobile/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ impl Target {
135135
}
136136
}
137137

138+
#[derive(Debug, Clone, Serialize, Deserialize)]
139+
pub struct TargetDevice {
140+
id: String,
141+
name: String,
142+
}
143+
138144
#[derive(Debug, Clone, Serialize, Deserialize)]
139145
pub struct CliOptions {
140146
pub dev: bool,
@@ -143,6 +149,7 @@ pub struct CliOptions {
143149
pub noise_level: NoiseLevel,
144150
pub vars: HashMap<String, OsString>,
145151
pub config: Option<ConfigValue>,
152+
pub target_device: Option<TargetDevice>,
146153
}
147154

148155
impl Default for CliOptions {
@@ -154,6 +161,7 @@ impl Default for CliOptions {
154161
noise_level: Default::default(),
155162
vars: Default::default(),
156163
config: None,
164+
target_device: None,
157165
}
158166
}
159167
}

0 commit comments

Comments
 (0)