Android x86 on VirtualBox: Android Connected But Not Online - android

I am trying to configure a Android x86 running machine using Oracle VirtualBox so that it works with Eclipse. I am having some trouble in making my virtual machine "online". I connected the phone to adb by typing the following in the Android Terminal Emulator:
ifconfig eth0 192.168.40.1 netmask 255.255.255.0
route add default gw 192.168.40.1 dev eth0
Afterwards, I switched to cmd and typed
adb connect localhost
But when I try to run my test code using Eclipse on the virtual Android, it does not appear in the Android Device Chooser Menu. Furthermore, when I typed adb devices in cmd, this was the response:
List of devices attached
localhost:5555 offline
The other thing that worries me is that each time after I shut down the VM, I have to type the ifconfig and route add commands again in the terminal when I restart, in order to connect to the device.
What can I do to make the device online?
EDIT:
In case it matters, the VM is configured to communicate over a NAT Network. This is what my Port Forwarding Rules look like:
Protocol: TCP
Host IP: *
Host Port: 5555
Guest IP: *
Guest Port: 5555
EDIT2
Related Question: Error: device offline
EDIT3: Potential Solution: Android device chooser - My device seems offline

This is much easier than all of that, to enable adb over tcpip in the Android VM Terminal Emulator type:
adb tcpip 5555
Then to connect via adb from a command line on your Eclipse machine:
adb connect 192.168.40.1:5555
The VM should now be available via adb devices as well as via the device view in Eclipse.

When I've started to develop some Android application, I have to deal with the same problem, so looking for something, on the VirtualBox guide I've read that the NAT does not require any configuration on the host network and guest system and for this reason, it is the default networking mode in VirtualBox. A virtual machine with NAT enabled acts much like a real computer that connects to the Internet through a router. The "router", in this case, is the VirtualBox networking engine, which maps trac from and to the virtual machine
transparently. In VirtualBox this router is placed between each virtual machine and the host. This separation maximizes security since by default virtual machines cannot talk to each other. The disadvantage of NAT mode is that, much like a private network behind a router, the virtual machine is invisible and unreachable from the outside internet. The network frames sent out by the guest operating system are received by VirtualBox's NAT engine, which extracts the TCP/IP data and resends it using the host operating system. To an application on the host, or to another computer on the same network as the host, it looks like the data was sent by the VirtualBox application on the host, using an IP address belonging to the host. VirtualBox listens for replies to the packages sent, and repacks and resends them to the guest machine on its private network.
The virtual machine receives its network address and configuration on the private network from a DHCP server integrated into VirtualBox. The IP address thus assigned to the virtual machine is usually on a completely different network than the host. As the virtual machine is connected to a private network internal to Virtual-Box and invisible to the host, network services on the guest are not accessible to the host machine or to other computers on the same network. However, like a physical router, VirtualBox can make selected services available to the world outside the guest through port forwarding. This means that VirtualBox listens to certain ports on the host and resends all packets which arrive there to the guest, on the same or a different port.
So, executing cmd, go to the folder where the VirtualBox is installed and where the VBManage.exe is and type this in order to apply the TPC port forwarding:
VBoxManage modifyvm "NameOfYourAndroidVM" --natpf1 adb,tcp,*,5555,*,5555
Now you can connect to your virtual machine through adb with:
adb connect localhost

Just configure the vm to use the pridge network mode and have a dhcp server enabled on the network.

I reckon most people have already tried this, but in my case the issue was fixed simply by connecting to VirtualBox's built-in wifi access point called "VirtWifi" (which gives the virtual machine internet access). All my virtual machine network changes are default besides the 5555 Port Forwarding rule. I am virtualizing Android v9.0 (Pie).

Related

How to remotely ssh on to a linux server install/run on an Android device by Complete Linux Installer

I have installed and running an ubuntu server on an Android device by using Complete Linux Installer. The android server runs ok. I can log in to the server on the Android device by using terminal simulator app.
What I want is ssh on to that Android-Linux-server from remote. I have got the server ip from ifconfig, which is 182.168.1.17. I have the root password.
So I do ssh root#182.168.1.17 on a pc. I can ping that ip on the pc. But I got ssh port 22 connection refused.
What should I do?
1) Maybe you need to do port forwarding on your router / modem
2) Or maybe you are behind NAT
Make sure that your ip is public but if your ip is behind NAT, you can use tor and torsocks to get access to your phone

Connect guest OS (ubuntu) to genymotion on host machine

I have an Ubuntu VM running on VirtualBox and an Android emulator running through Genymotion (which also uses VirtualBox), so I thought I could easily connect one VM to the other, right? Turns out it isn't so simple. I added a bridged adapter to the Ubuntu VM, restarted the ADB server and then ran adb connect -emulatorIP- This allows me to see the device, but the problem is that adb insists that the device is offline, when it quite clearly isn't. So I'd like to ask for help with this issue.
So actually all you have to do is pretend that you're trying to connect to a remote device. On the host machine run
adb tcpip <port>
which will enable that port for remote connection. Then run in the VM
adb connect <deviceip>:<port>
to connect to the genymotion device.
For further reference: https://developer.android.com/studio/command-line/adb.html#wireless

Implementing USB sharing over network

I set out to see if I can configure my development environment such that I can run adb commands from my dev box in the office network on an Android device that is connected to the USB port of my laptop which is in the same LAN (or connected via VPN). I specifically wanted the adb server to be running on the dev box and communicating to the adb daemon on my device over the network. I didn't want to connect the adb client that runs on the dev box to the adb server running on my laptop which the adb tool allows via its -H option and I didn't want to use the adb connect or adb tcpip commands. Basically, I just wanted to relay the adb communication that happens over the USB cable to happen over the network (SSH tunnel).
As a proof of concept, I managed to build a prototype using a third party solution that would allow me to share USB over network but now I want to see if I can build the same solution using port forwarding and some coding. However, my technical knowledge of USB drivers, OS kernels, and how the USB communication works (on Linux and Mac) is very basic so I am hoping to find some answers from the community.
Question: Where in the USB stack do I need to start creating hooks so I can forward all data communication of a certain USB port to a different process running in the same OS?
Proposal: If I can find the port numbers that the USB drivers on each machine communicate to the process in the kernels that then forwards the data to the application, I can use port forwarding on each machine to re-route the communication to a daemon process running on each machine that then wraps the data in TCP/IP and transfers over the network. The image below depicts this scenario:
The adb server that runs on the client machine will need to be configured to route its communication to a port on the client machine that an damon emulator process listens. This daemon process will then have to transmit the data over the network to another daemon process running on the server machine that hosts the Android device via a USB port. The latter daemon process listening to the same port that the client machine send out TCP/IP data will then read the data, transforms it to adb protocol, and sends the data to the USB device. The parts of this solution that I am trying to learn more about is how to write a daemon process that acts as a USB device emulator. Any help or recommendations for further reading is appreciated.
I found a very easy fix to this problem. I was able to get this working by running the commands below.
On my remote development machine: ($remote_host)
adb kill-server
On my laptop:
adb kill-server
adb start-server
ssh -N -R 5307:localhost:5307 $remote_host
And, finally on my remote development:
adb start-server
I was then able to run adb devices on my remote machine (using an SSH tunnel) and see the SN of the device that is connected to my laptop.

Android Studio connect ADB via Ethernet

Is there a way to connect the ADB via Ethernet from within the Android Studio IDE? The device I have to use has no USB slave ports.
This feature has been added recently.
Install some Android-x86 on your Xen/KVM/Virtualbox VM and enable debug there.
Ensure you've got shared bridge connection or virtual network device that can reached from outside of VM and can resolve some network address from your favourite WiFi router.
So resolve some address via root terminal with dhcpcd.
There is no ifconfig there. Only ip addr show and ip link show.
Connect with adb to 192.168.x.x with adb connect 192.168.x.x or whatever
Go to Run => Edit Configurations => General => Target device
and choose Show chooser dialog
So when you press run - choose your device and have fun.

Debug device connected by USB to VirtualBox's host, from Android-Studio inside VM

I am trying to get mono for android (aka monodroid) working within a windows 7 virtual machine on virtualbox but I am having issues with the adb connection to my phone. When I run "adb devices" to list the devices present it show up no problem, but when I attempt to run an "adb install", logcat, or push it hangs. Currently there is a bug in virtualbox which applies to this but I was hoping someone more knowledgeable than myself would have a workaround.
https://www.virtualbox.org/ticket/6620
Of coarse non of this would be an issue if Xamarin released a linux port of their product or if I got familiar with Java, but I suppose those are slightly different issues.
Brian, one workaround you might consider is to make your VM host an ADB host as well. Then you can just connect your VM client to it over TCP / IP. Here's the general idea for that setup:
Install the Android SDK on the host machine. You should only require the platform-tools package which includes adb.
Don't allow your VM client to take ownership of the Android device, so disable any VirtualBox USB filter rules you have and it also wouldn't hurt to then detach and reattach the device.
From your VM client, run adb kill-server. Make it a tskill adb for certainty. If you have any running instances of Eclipse, you'll want to shut those down first because it'll actually launch adb in the background. Don't skip this step.
From the host, execute adb devices. If all goes well (and it should), you'll see your device listed. It should look something like this (note the port number and sorry for the mangling):
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
015d2994ed200409 device
At this point, your host should have an ADB server running at port 5037. You can check this from the VM client by running telnet 10.0.2.2 5037, where 10.0.2.2 is the default IP for VirtualBox hosts and 5037 is the default ADB port noted above.
Now you must either forward the ports from your host to your VM client, or otherwise connect ADB directly to your host IP:port. If you're like me, you'll find the ADBHOST and ANDROID_ADB_SERVER_PORT variables to be poorly documented and easy to screw up. For this reason, consider simple port fowarding over ssh (maybe via Cygwin) like so from the VM client:
autossh -nNL5037:localhost:5037 -oExitOnForwardFailure=yes 10.0.2.2
Finally, run adb devices from your VM client. If you see "daemon not running," it means your port fowarding is screwed up. Otherwise you should see your device and be able to logcat all day. One noteworthy point is that you won't have an adb daemon running on your VM client, except for when you're actually using the debug bridge, of course.
I've used a similar mechanism for debugging devices over the network that are connected to remote machines and it worked well.
Not sure what has changed in VirtualBox since the question was posted, but selecting the usb device from VirtualBox menu Devices -> USB -> DeviceName worked seamlessly. I am working on VirtualBox 5.1.2 r108956.
I was also having trouble with ADB running over VM. I had a Windows 10 host and an Ubuntu 14.04 client. The autossh method did not work for me. I found an easier solution from another StackOverflow question. It requires that both your PC and your device are on the same WiFi network.
On your VM client run the following: adb tcpip 5555
The device will disconnect from the VM because ADB is now in TCP
mode instead of USB.
For the next part you need the IP address of
your device. To find it, simply run adb shell ip -f inet addr show wlan0
Now you can connect to your device. On your VM client, run:
adb connect <Device IP>:5555
From here all my adb shell, logcat, and monkey sessions ran without interruption!
I'm posting this here for people with a setup similar to mine:
Host OS: OSX (10.15.4 Catalina)
Client OS: Windows 10 Enterprise (v1903 build 18362.752)
VirtualBox v6.1.4
Android Studio v3.6.2
To allow Android Studio in client OS (Windows) to connect to an Android phone (using adb) via USB:
Update to latest version of VirtualBox (currently 6.1.4)
Install VirtualBox Extension Pack from here
With the VM powered down, go to Settings > Ports > USB and make sure the USB 3.0 (xHCI) Controller is enabled, then click "OK"
From the host OS (i.e. OSX) open up a terminal and start adb and confirm that the phone is connected by running adb devices
Start up the VM, and from the VirtualBox menu select Devices > USB > [YOUR PHONE] to connect your host OS USB port to the VM
Open up a terminal on the client OS (Windows) and run adb devices to confirm that the adb server is running and can find your phone. You might need to add the Android platform tools to your PATH (mine was at C:\Users\Username\AppData\Local\Android\Sdk\platform-tools). This step might be optional--I suspect that Android Studio might start up adb on its own.
Start up Android Studio in the client OS (Windows) and go to File > Settings > Appearance and Behavior > System Settings > Android SDK > SDK Tools and make sure that the Google USB Driver is installed (see screenshot here)
After I did these things, Android Studio was able to detect my phone and run/debug apps using that device.
Hope this helps!
I had the same problem and it made me search for about 2 hours.I tried several approaches including all above solutions but none of them worked
My situation
My host was archlinux and the guest was windows 8.1 I was running flash builder in windows but the usb debugging wouldn't work and my connected device was nexus 5 so i followed these steps
Enable USB controller from virtualbox menu Machine-->settings-->usb enable usb controller and enable USB 2.0 (EHCI) controller then add your device(click on + button on right side) then start your virtual machine
Now you should download the latest google usb drivers from here and extract it
Go to control panel device manager right click on your device go to driver tab and click on Update driver there should be two option one search automaticly ... and another browse my computer choose the second one and give the extracted file path(check the Included subfolders option) after this your device should be recognized by windows and there will be a message in your android device for allowing access to your device
In my case i should copy the drivers to flashbuilder android drivers path too but maybe for your situation this isn't necessary
I had same problem with VirtualBox 5.0.14 and solution provided by Stephen Niedzielski didn't work for me. If someone is still interested can try this solution.
My environment is:
Host OS: Mac OS 10.11
Guest OS in VirtualBox: Ubuntu 14.04
Device: Galaxy S5 running Cyanomodgen 12.1
Start a wifi hotspot in host OS and connect there the android device, or connect both in a router. In virtualbox set network mode for guest OS to 'Bridged Adapter' and then select name of Wifi adapter. In that way host OS and android device are in same network.
Then, in android device activate 'Developer mode' and enable 'ADB over network', provided from Cyanomodgen. (For devices with original version of android, google how to use ADV over network if possible)
In host OS run 'adb kill-server' and make sure no instance of ADB is running. Then run command 'adb connect 192.168.2.12', ip of android device.
Congrats :) Now you are are able to use ADB with android device to take logcat or pull and push files.
Install the Android SDK on the host machine. You should only require the platform-tools package which includes adb.
Don't allow your VM client to take ownership of the Android device, so disable any VirtualBox USB filter rules you have and it also
wouldn't hurt to then detach and reattach the device.
From your VM client, run adb kill-server. Make it a tskill adb for certainty. If you have any running instances of Eclipse, you'll
want to shut those down first because it'll actually launch adb in
the background. Don't skip this step.
From the host, execute adb devices. If all goes well (and it should), you'll see your device listed. It should look something like
this (note the port number and sorry for the mangling):
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
015d2994ed200409 device
At this point, your host should have an ADB server running at port
5037. You can check this from the VM client by running telnet 10.0.2.2 5037, where 10.0.2.2 is the default IP for VirtualBox hosts and 5037 is the default ADB port noted above.
(https://stackoverflow.com/a/12557836/16902966)
and in the virtual machine (Windows):
set ADB_SERVER_SOCKET=tcp:10.0.2.2:5037
Connected device(s): ...\platform-tools>adb.exe devices .

Categories

Resources