adb nació para un cable USB y, más tarde, para la red local. También funciona por internet, y muchos equipos dependen de eso: un runner de CI en una región que habla con teléfonos en otra, un desarrollador que desde casa llega al rack de la oficina, una suite de pruebas que maneja teléfonos en la nube. Pero la configuración por defecto da por hecho una red de confianza. Si se configura mal, un puente de depuración se convierte en una shell remota para cualquiera que lo encuentre.
Esta guía explica cómo se comunica adb, cuatro formas seguras de llevarlo por internet con los comandos exactos y una lista de verificación para mantenerlo cerrado.
Cómo se comunica adb
Intervienen tres piezas. El cliente adb es el comando que escribes. El servidor adb es un proceso en segundo plano en la misma máquina, que escucha en 127.0.0.1:5037 y lleva el registro de los dispositivos. adbd es el daemon del teléfono. El servidor llega a adbd por USB, por TCP sin cifrar después de adb tcpip o por TLS con la depuración inalámbrica de Android 11 en adelante.
Trabajar en remoto significa estirar uno de esos tramos por internet: del cliente al servidor o del servidor a adbd. El tramo que estires define el método.
Dos hechos marcan el panorama de seguridad. adbd pide al usuario que autorice una vez la clave RSA de cada computadora, lo que deja fuera a los desconocidos que el teléfono nunca ha visto. Pero el modo TCP clásico no cifra nada: la salida de la shell, el logcat y cada archivo que envías viajan en texto plano.
Lo que nunca hay que hacer
No redirijas los puertos 5555 o 5037 a internet en tu router ni los abras en un firewall de la nube. En 2018 un gusano conocido como ADB.Miner se propagó por dispositivos Android que exponían adb en el puerto 5555, sobre todo TV boxes, y los convirtió en mineros de criptomonedas. Los escáneres buscan puertos de adb abiertos todo el tiempo.
Evita también iniciar el servidor adb con -a, que lo pone a escuchar en todas las interfaces. Cualquiera que llegue a ese puerto maneja todos los dispositivos conectados al host, sin ningún diálogo de clave de por medio.
Forma 1: túnel SSH hasta un servidor adb remoto
Úsala cuando los teléfonos están conectados por USB a un host al que puedes entrar por SSH: un rack de oficina, una máquina de laboratorio, un servidor de CI. Redirige un puerto local al servidor adb del host y apunta tu cliente a él:
ssh -N -L 15037:127.0.0.1:5037 user@lab-host adb -P 15037 devices ADB_SERVER_SOCKET=tcp:127.0.0.1:15037 adb -s SERIAL logcat -d
Usa un puerto local distinto de 5037 para que tu propio servidor adb no choque con el túnel. Instalaciones, envíos de archivos, shell y logcat funcionan, porque el cliente transmite todo a través de su conexión con el servidor.
Una sorpresa: adb forward ahora abre su puerto en el host del laboratorio, no en tu computadora. Para llegar a un puerto redirigido desde tu máquina, agrega para él un segundo -L al comando SSH.
SSH te da claves y un cifrado en los que ya confías, y un solo túnel cubre un estante entero. El costo es un host que mantener y una cuenta en él, y quien tenga esa cuenta controla todos los teléfonos conectados.
Forma 2: túnel SSH hasta adbd
Úsala cuando un teléfono está en una red a la que llegas a través de un host de salto y no tienes acceso USB a ninguna máquina de esa red. Pon el teléfono en modo TCP una vez, por USB o con depuración inalámbrica, y luego abre el túnel hasta él:
adb tcpip 5555 ssh -N -L 15555:192.168.1.50:5555 user@jump-host adb connect 127.0.0.1:15555
Elige un puerto local fuera del rango de 5555 a 5585, porque el servidor adb trata los puertos locales de ese rango como emuladores. El teléfono tiene que seguir en modo TCP, algo que la mayoría de las compilaciones pierde al reiniciar, y la primera conexión sigue mostrando el diálogo de la clave en el teléfono, así que alguien tiene que aceptarlo una vez.
Forma 3: depuración inalámbrica por VPN
Android 11 incorporó la depuración inalámbrica: emparejamiento con un código y después una conexión TLS. Está pensada para una red local, pero funciona a través de una VPN como WireGuard o Tailscale, siempre que tu computadora y el teléfono puedan llegar a las direcciones privadas del otro. Activa Depuración inalámbrica en Opciones para desarrolladores, elige vincular el dispositivo con un código de vinculación y ejecuta:
adb pair 100.64.0.12:37099 adb connect 100.64.0.12:41235
adb pair pide el código de seis dígitos. El puerto de emparejamiento y el de conexión son distintos, y ambos cambian cada vez que se activa o desactiva la depuración inalámbrica. La detección por mDNS no atraviesa la mayoría de las VPN, así que escribe la dirección que muestra el teléfono. Además, el ajuste se desactiva solo cuando el teléfono sale de su red Wi-Fi, lo que lo hace poco adecuado para cualquier cosa desatendida.
Forma 4: el relé de una nube de dispositivos
Las nubes de dispositivos ponen un relé delante de adbd y dan a cada teléfono su propia dirección. Los detalles cambian según el proveedor. Así funciona el relé en Clousd, según la documentación de ADB:
- ADB viene desactivado. Lo activas por teléfono para una lista de hasta 20 direcciones IP o rangos permitidos.
- El acceso caduca solo: a las 24 horas por defecto, a los 7 días como máximo. Las sesiones inactivas se cierran a los 30 minutos.
- Inicias sesión con un código de un solo uso que se muestra una vez. Los códigos incorrectos cierran la sesión, y los fallos repetidos desactivan el relé.
- Root, remount, reverse, reboot y comandos similares siempre se rechazan, y cada sesión queda registrada.
adb connect HOST:PORT adb -s HOST:PORT shell clousd-login CODE adb -s HOST:PORT install app-debug.apk adb -s HOST:PORT logcat -d
No hay nada que alojar ni nada que abrir en tu propia red. A cambio, algunos comandos quedan fuera. Los flujos de trabajo que dependen de adb reverse, como una app de React Native que se conecta al servidor Metro de tu computadora, necesitan otro camino, por ejemplo un servidor de desarrollo al que el teléfono llegue por URL. Si de entrada no tienes hardware al que conectarte, un teléfono Android remoto en la nube ya viene con el relé delante.
Las cuatro formas, comparadas
| SSH al servidor adb | SSH a adbd | Depuración inalámbrica por VPN | Relé de una nube de dispositivos | |
|---|---|---|---|---|
| Dónde está el teléfono | por USB en un host que controlas | en una red detrás de un host de salto | en una red a la que llega tu VPN | en el centro de datos del proveedor |
| Qué mantienes tú | el host y el acceso SSH | el host de salto y el modo TCP | la VPN y el teléfono en Wi-Fi | nada |
| Control de acceso | claves SSH | claves SSH más la clave de adb | VPN más emparejamiento | lista de IP, caducidad, código de un solo uso |
| Sobrevive a un reinicio del teléfono | sí | casi nunca | no | sí |
adb reverse | sí | sí | sí | a menudo rechazado |
| Ideal para | racks de oficina, hosts de CI | acceso puntual a un laboratorio | un teléfono personal | equipos y CI sin hardware |
Latencia y ancho de banda
adb conversa mucho, pero tolera bien la distancia. Una adb shell interactiva se puede usar con 200 ms de ida y vuelta, y el logcat se transmite sin problemas. Las instalaciones y los envíos de archivos dependen de tu velocidad de subida, así que un APK de 150 MB por una conexión doméstica lenta tarda minutos.
Las pruebas de instrumentación son las que más sufren, porque cada acción de la interfaz espera una respuesta. Sube los tiempos de espera y cambia las pausas fijas por esperas a una condición, en lugar de alargar las pausas. Para duplicar la pantalla con scrcpy por un túnel SSH, baja la tasa de bits y el tamaño con scrcpy --video-bit-rate=2M --max-size=1024. En un teléfono en la nube, la pantalla en el navegador suele cubrir esa necesidad.
Pruebas en dispositivos Android remotos desde CI
Un job de CI que prueba en teléfonos remotos tiene cuatro pasos: conectar, esperar al dispositivo, ejecutar y desconectar. Agrega el paso de inicio de sesión si tu relé lo tiene.
adb connect "$DEVICE" adb -s "$DEVICE" wait-for-device adb -s "$DEVICE" install -r app-debug.apk adb -s "$DEVICE" install -r app-debug-androidTest.apk adb -s "$DEVICE" shell am instrument -w com.example.app.test/androidx.test.runner.AndroidJUnitRunner adb disconnect "$DEVICE"
Guarda las direcciones de los dispositivos y los códigos de acceso en los secretos de CI, no en el repositorio. La página de pruebas de apps muestra cómo se ve la misma ejecución con una API REST, y probar una app Android online explica en detalle la prueba de humo y los comandos de logcat. Si estás decidiendo si te conviene mantener tu propio rack, lee granja de dispositivos Android.
Lista de verificación de seguridad
- Nunca expongas los puertos 5037 o 5555 a internet.
- Trata
~/.android/adbkeycomo una credencial. Es tu identidad ante cada teléfono que confió en ella, así que no la copies a máquinas compartidas. - En los teléfonos del laboratorio, usa de vez en cuando Revocar autorizaciones de depuración USB en Opciones para desarrolladores.
- Prefiere accesos que caduquen solos y estén limitados a direcciones conocidas.
- Al terminar, desconéctate y detén el servidor con
adb disconnectyadb kill-server, y desactiva la depuración inalámbrica. - Lleva un registro de quién se conectó a qué teléfono y cuándo.


