Cómo hacer ADB sobre 'wifi' (en realidad en la misma PC) para un dispositivo emulado

Estoy tratando de usar adb sobre 'wifi' para mi dispositivo emulado. Estoy emulando un dispositivo en mi computadora y quería usar Android Studio para enviarle un APK pero a través de los enchufes de red, no a través de USB emulado. Sé que en Android Studio todo funciona de manera inmediata, pero lo necesito de esta manera

Estoy siguiendo este tutorial: https://developer.android.com/studio/command-line/adb.html#wireless

empiezo con

~/Android/Sdk/emulator$ ./emulator -avd Pixel_XL_API_27

Luego veo que la depuración USB está activada. entonces hago

./adb tcpip 5555
restarting in TCP mode port: 5555

Tenga en cuenta que . /adb tcpip 5555es arbitrario Ni siquiera especifiqué qué dispositivo debería reiniciarse y conectarse en 5555. ¿Qué sucede si tengo 2 emuladores ejecutándose?

Debería desconectarme ahora para un dispositivo USB normal, pero luego voy a las opciones de desarrollador en mi teléfono emulado y deshabilito la depuración de USB.

También veo que la dirección IP en la configuración del sistema telefónico emulado es192.168.232.2

entonces termino con:

./adb connect 192.168.232.2
unable to connect to 192.168.232.2:5555: Connection timed out

También hice esto:

./adb devices 
List of devices attached
emulator-5554   device

./adb connect 192.168.232.2:5554
unable to connect to 192.168.232.2:5554: Connection timed out

ACTUALIZAR:

De acuerdo con el Tutorial de Android en ADB , mi computadora mantiene un servidor ejecutándose en el puerto 5037. El dispositivo Android (mi emulador en este caso) ejecuta un demonio y mi secuencia de comandos adb en Sdk/platform-tools es un cliente. Si quiero ejecutar un cliente dentro de mi máquina virtual, debo tener un servidor ejecutándose en él. Pero, en cambio, puedo reenviar el puerto TCP 5037 de la máquina virtual al puerto TCP 5037 de la máquina host. Lo hice con tcptunnel haciendo lo siguiente:

./tcptunnel --local-port=5037 --remote-host=192.168.122.1 --remote-port=5037 --stay-alive

luego, si ejecuto adb en mi VM, se conectará al demonio adb en mi máquina host que se comunicará con el servidor adb de mi emulador. Cuando ejecuto adb devicesla máquina virtual sin el reenvío de tcp, intenta iniciar un nuevo servidor. Si elimino este servidor y abro el tcpforwarded y lo vuelvo a hacer, no intenta crear un nuevo servidor. Esta es una buena señal. Sin embargo, tcptunnel me da esto:

build_tunnel: connect(): Connection refused

Algo está bloqueando la conexión.

ACTUALIZACIÓN 2:

Resulta que tcptunnel no es necesario, porque adbtiene la Hopción que me permite especificar la IP donde se ejecuta el servidor. Sin embargo, no sé si es posible especificarlo en Android Studio. De todos modos:

./adb -H 192.168.122.1 devices
List of devices attached
* cannot start server on remote host
error: cannot connect to daemon at tcp:192.168.122.1:5037: Connection refused
¿Podría decirme si está tratando con un dispositivo físico o con un emulador dentro de su sistema operativo?
@AbdelhafidMadoui es un emulador en el mismo sistema operativo
Entonces, ¿qué tiene de malo el comando adb -s emulator-5554 shell, por ejemplo? ¿Por qué Wi-Fi?
@AbdelhafidMadoui Necesito programar dentro de una VM. Sin embargo, no puedo iniciar un nuevo emulador dentro de esta máquina virtual. En su lugar, quiero iniciar el emulador en paralelo con la máquina virtual y pasar la aplicación a través de TCP.
@GuerlandoOCs: OK, entonces el emlator se inicia desde el sistema operativo principal, ¿y quieres acceder a él desde la máquina virtual? ¿Correcto? ¿Qué software de máquina virtual estás usando?
@AbdelhafidMadoui Estoy usando virt-manager, usa kvm con SPICE

Respuestas (1)

Olvidé que adb daemon se une a localhost, y estaba tratando de acceder desde 192.168.122.x.

Pude socatredirigir el cliente ADB desde mi VM al demonio ADB en mi máquina host que se conectó con el servidor ADB (mi teléfono emulado).

Se podía acceder a mi máquina host 192.168.122.1desde la máquina virtual, pero adb daemonestaba vinculado a 127.0.0.1o localhost. Lo acabo de hacer:

#on host machine:
socat tcp-listen:5037,bind=192.168.122.1,reuseaddr,fork tcp:localhost:5037

#on virtual machine:
socat tcp-listen:5037,bind=localhost,reuseaddr,fork tcp:192.168.122.1:5037

Asegúrese de eliminar el servidor adb en la máquina virtual haciendo /path/to/android/sdk/platform-tools/adb kill-server. El servidor ADB siempre intenta vincularse 5037si no hay nada allí, por lo que si socat ya se está ejecutando en ambos lados y adb serverse está ejecutando en la hostmachie, cuando inicie Android Studio en la máquina virtual, se conectará automáticamente al servidor adb externo, que se conectará a su teléfono emulado.

No necesita Android Studio en la máquina virtual para probar. Simplemente puede hacerlo /path/to/android/sdk/platform-tools/adb devicesen la máquina virtual para ver si socat lo redirigirá al demonio adb en el host, que enumerará el teléfono emulado.