@@ -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+ }
0 commit comments