53

My scenario is this: I telework from home and log into my work machine via Windows Remote Desktop. I use Eclipse as my development environment for Android apps on my work computer.

Using ADB, I would like to be able to deploy apps from my work computer to a device on my home network, for scenarios where the emulator doesn't do the app justice.

I found this post, which discusses a very similar scenario, with the exception of deploying to an emulator running on a local PC, instead of deploying to a local device:

Android: ADB remote emulator access

I'm trying to take the same steps, but figure out how to target a local device on my home Wi-Fi network and tethered to my local home PC, instead of the local emulator.

Right now, I have the remote PC set up to try and connect to my public router IP address on port 5585, but in my router, what IP address/port do I forward this to to connect to the local device?

In the example using the emulator, they forward to the local PC address where the emulator is running and port 5555, and ADB is not running on the local PC. I have configured my router to forward to my device IP address, with the device on Wi-Fi, as well as my local PC IP address where the device is tethered.

However in both scenarios, when I try adb connect <router_IP_address>:5585 on my remote PC, it gives me an error unable to connect to <router_IP_address>:5585:5585. I get the same response when trying to forward to/listen to other ports. I'm not getting any security errors in the router log, so it appears the port forwarding is working.

Questions:

  • What local IP address/port number should I forward to when configuring port forwarding on my local network to connect to the local device using the remote ADB instance?
  • Should I be targeting the local PC IP address that the device is tethered to, or the local device IP address?
  • If I target the local device IP address, what port number should I forward to?
  • Do I need ADB running on my local PC?
4
  • 1
    Any reason why you don't copy the apk to your local machine and just deploy it from there? Commented Nov 7, 2012 at 21:48
  • FYI, it seems that adb connect is supposed to target the IP of the actual Android device based on what I see here: stackoverflow.com/questions/2604727/… Commented Nov 7, 2012 at 21:54
  • @AbdullahJibaly Copying the APK locally is an option, but just not a very efficient one in the iterative development process. I'd prefer to use ADB directly, which cuts a lot of the steps in between compiling and the app appearing on the device. Commented Nov 7, 2012 at 22:23
  • @AbdullahJibaly There isn't an approved answer on the post you list, so I'm not sure what to make of it. Also, these responses also seem to require root - I'd like to do this on a stock device. When I try 'adb tcpip 5555' to redirect, it just hangs at the 'redirecting' message and doesn't return to the prompt. Commented Nov 8, 2012 at 15:24

7 Answers 7

51

I had a similar situation. I work on a remote desktop for development, but my Android device is connected to my local laptop. I wanted to be able to use ADB and the Android plugin in Eclipse on the remote desktop and connect to the device attached to my laptop. After searching on the Internet and not finding anything that really helped, I decided to write a port forwarder that would do the trick. You can find it here.

18
  • Very nice! I got this working using Eclipse Juno on the machine I'm remote-desktopped into, and with the device (Samsung Galaxy S3) plugged into my local machine. I was able to see the Logcat output via DDMS from the device on the remote desktop machine, execute adb commands from the commandline, and deploy an app. Very smooth and much better than trying to shuffle APKs between machines. fyi - I am getting a ton of "socket closed" errors in both command line consoles, and "An established connection was aborted by the software in the host machine" in Eclipse console. But, it still works. Commented Mar 27, 2013 at 20:31
  • 3
    Project has moved to bitbucket. You can find it at: bitbucket.org/chabernac/adbportforward/wiki/Home Commented Apr 10, 2014 at 14:49
  • 1
    I followed what you've suggested at above bitbucket link and my connection is all set and done but as soon as I run adb commands for e.g. adb devices i get following error : 167838 [pool-1-thread-2] ERROR chabernac.portforward.PortForward - An error occ ured in setting up connection to 10.94.14.132:6037 java.net.ConnectException: Connection refused: connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress.............
    – roger_that
    Commented Jun 6, 2014 at 8:04
  • 2
    @GuyChauliac, great! worked very smoothly. but some systems are unable to start acting as a client, they can ping the server successfully, can act as a server, but when I fire command for Client, it gets stuck after "Android ADB client started: true" then no updation even when the server is in ready state. :(
    – jQueen
    Commented Jul 22, 2014 at 11:52
  • 1
    I code inside a Linux VM, so I can't run a HAXM emulator on the guest OS, but with this workaround I can deploy to a HAXM emulator running on the host! Thanks for this! Commented Oct 28, 2014 at 17:08
26

Beginning Android 4.3 you can:

  1. Make adb server listen on all interfaces. You have two options:
    • Make gListen=1 and recompile adb (I have compiled it on Linux-x64 machine for you and put it here)
    • Start adb server with -a parameter: adb -a -P 5037 fork-server server&
  2. Use adb on your remote machine with extra parameter, e.g. adb -H <remote_host> shell
5
  • 2
    Thanks for the alternate approach! To clarify - does this require that the Android device be 4.3 or higher? Or does this require the SDK tools released with Android 4.3? Commented Sep 18, 2013 at 20:01
  • I just tested it and it works fine with a 2.3 Gingerbread device.
    – kar
    Commented Sep 23, 2014 at 8:17
  • This works, but it is very slow to push files to the emulator (adb install is very slow, for example). This is not a network or SSH problem since rsync is working fine. Any tips?
    – amfcosta
    Commented Mar 8, 2015 at 20:56
  • Could someone please provide an example of how to make it work using option 2?
    – AlexIIP
    Commented Nov 26, 2015 at 6:21
  • Excellent answer, exactly what i'm looking for. The end '&' can be delete.
    – Swing
    Commented Jan 28, 2016 at 2:45
14

Another setup for remote host + local device testing. This will be useful for lots of people working from home on a laptop, connected to their development host machine still in the office. Note that I assume both development host/laptop are both running Unix, but other OSes will be able to run the commands on the command prompt/shell.

On the development host

# Kill the old ADB server.
adb kill-server

On the laptop

# Activate ADB server on the client
adb start-server

# Start an SSH tunnel. Hide/minimize this window to not close it by accident
ssh -XC -R 5037:localhost:5037 <your development host machine>

On the development host

# It should work by now with the local device connected to the laptop
adb logcat
5
  • 1
    This is by far the best solution
    – distante
    Commented Aug 13, 2020 at 8:36
  • in my case, when using QT Creator, it additionally attempts to use port 5039 and once the app gets deployed (it does) the mobile keeps waiting for debugger on port 8100, ideas?
    – Vega4
    Commented Jan 24, 2021 at 18:12
  • amazing. confirmed that this works with windows wsl as well
    – Jun
    Commented Mar 16, 2021 at 10:54
  • It works, I can connect with "adb shell" 👍 but how to bring them into AndroidStudio device dropdown list and be able to debug on it ?
    – hannes ach
    Commented Feb 25, 2022 at 11:56
  • The only thing is that -XC parameters to ssh seem to be unrelated to the solution.
    – Slava
    Commented May 11, 2022 at 12:06
5

You can solve the issue by port forwarding.

  • Download Secure Shell app from the Chrome app store
  • Connect to your machine (step-by-step setup)
  • In this connection, disable adb server: adb kill-server
  • Create a new port forwarding connection (same as a regular connection, but set the SSH Arguments field to: -N -R 5037:localhost:5037)
  • On your laptop, open up a terminal and enable adb server: adb start-server
1
  • Very helpful instructions. But note that this work only if adb versions on local and remote machines are the same
    – Ajay
    Commented Feb 26, 2016 at 4:42
5

Probably there is a simpler solution, provided the device, the local, and the remote machine belong to the same network.

Let's say your device has a certain IP address over the network and let's say you decide to use your preferred port: Well, you can do the following steps.

On the machine where the device is plugged in, please run:

adb devices

adb tcpip <PORT>

An example of PORT is 5555.

On the remote machine, you need to deactivate 'Discover USB devices', 'Discover network targets' and 'Port forwarding'. And then run:

adb connect IP_ADDRESS:PORT

IP_ADDRESS is your Android device IP address (not the first machine's IP address) which you can get from adb shell ip -f inet addr.

And you are ready to debug on the remote machine.

1
  • it's connected with rdp , but how i can see the device list ? adb devices show nothing Commented Nov 27, 2020 at 17:04
5

This is how I made it work from the host macOS with the emulator to the macOS client.

A: One line command

On the host of the emulator

socat tcp-l:5560 tcp:localhost:5559

On the client

adb connect <IP address>:5560

B: With a tunnel

On the host

adb kill-server
adb -a nodaemon server

On the client

adb kill-server
ssh -L 5037:localhost:5037 <host IP address>

Open a second shell on the client

adb kill-server  # I observe first it kills the client ADB
adb kill-server  # Then it kills the server ADB. Do it maybe once more
adb devices      # Show devices on the server now

Now I see the host emulator in Android Studio as well:

Enter image description here

1
  • Great Answer, really thanks, i search the web a night until morning for this
    – a55
    Commented May 14, 2022 at 4:38
2

My situation required using a VM that is on a different network, but that I rmd into (an Azure VM). The VM and my local laptop are both running Windows 10. First, I had to install USB Redirector RDP Edition on my local machine (costs US$80, but there might be free alternatives), then install the Google Android USB driver on the VM and the Universal ADB Driver on the VM. I'm now able to load the project in Android Studio on the VM, connect an Android device on my laptop, and debug the app on the device.

Not the answer you're looking for? Browse other questions tagged or ask your own question.