La aplicación oficial de Android está disponible en Google Play. Es un nodo complementario y requiere un Gateway de OpenClaw en ejecución. Fuente: apps/android (instrucciones de compilación).
Resumen de compatibilidad
- Rol: aplicación de nodo complementario (Android no aloja el Gateway).
- Gateway requerido: sí (ejecútalo en macOS, Linux o Windows mediante WSL2).
- Instalación: Google Play para la aplicación, Primeros pasos para el Gateway y luego Emparejamiento.
- Gateway: Runbook + Configuración.
- Protocolos: Protocolo del Gateway (nodos + plano de control).
Reflejar y controlar Android desde un Mac remoto
scrcpy refleja una pantalla de Android en una ventana de macOS y reenvía la entrada de teclado y puntero a través de Android Debug Bridge (ADB). Este es un flujo de trabajo del lado del operador, separado de la conexión de nodo de OpenClaw. Es útil cuando el dispositivo Android y el Mac están en ubicaciones distintas, pero comparten una red privada de Tailscale.Antes de empezar
- Instala Tailscale en el dispositivo Android y en el Mac, y conecta ambos a la misma tailnet.
- En Android, activa Opciones de desarrollador y Depuración USB. Android 16 coloca Depuración inalámbrica en Ajustes > Sistema > Opciones de desarrollador. Consulta Opciones de desarrollador de Android.
-
Instala scrcpy y ADB en el Mac:
- Mantén el dispositivo Android disponible para la primera conexión. Android debe aprobar la clave ADB de cada Mac antes de que ese Mac pueda controlar el dispositivo.
Activar ADB sobre TCP
Para la configuración inicial, conecta el dispositivo Android por USB a un equipo de confianza y aprueba su aviso de depuración. Luego ejecuta:adb pair.
Permitir solo el Mac controlador
Las tailnets con permisos restrictivos deben permitir explícitamente que el Mac controlador alcance el puerto TCP 5555 en el dispositivo Android. Añade una regla limitada a la política de la tailnet, sustituyendo las direcciones de ejemplo por las IP estables de Tailscale de los dos dispositivos:Conectar e iniciar la duplicación
En el Mac remoto:adb connect desde este Mac muestra un diálogo de autorización en Android. Desbloquea el dispositivo,
confirma la huella digital de la clave y selecciona Permitir siempre desde este ordenador solo cuando el Mac sea
de confianza. Una entrada correcta de adb devices termina en device; unauthorized significa que el aviso en el dispositivo
no se ha aprobado.
Una vez que se abre la ventana de scrcpy, úsala directamente o dirígela con una herramienta de automatización de pantalla de macOS como
Peekaboo. scrcpy transporta la pantalla y la entrada; Tailscale solo proporciona la
ruta de red privada.
Solución de problemas
Connection timed out: verifica el permiso de tailnet para TCP 5555. Untailscale pingcorrecto demuestra la alcanzabilidad entre pares, no que la política permita este puerto TCP. Prueba connc -vz <android-tailnet-ip> 5555desde el Mac.unauthorized: desbloquea Android y aprueba la clave ADB del Mac remoto, o elimina la estación de trabajo obsoleta en Depuración inalámbrica > Dispositivos emparejados y vuelve a emparejarla.Connection refused: vuelve a conectar localmente y ejecutaadb tcpip 5555otra vez.- Más de un dispositivo listado: mantén el argumento explícito
--serial <android-tailnet-ip>:5555.
Runbook de conexión
Aplicación de nodo Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway Android se conecta directamente al WebSocket del Gateway y usa emparejamiento de dispositivos (role: node).
Para Tailscale o hosts públicos, Android requiere un endpoint seguro:
- Preferido: Tailscale Serve / Funnel con
https://<magicdns>/wss://<magicdns> - También compatible: cualquier otra URL de Gateway
wss://con un endpoint TLS real - El texto claro
ws://sigue siendo compatible en direcciones de LAN privadas / hosts.local, además delocalhost,127.0.0.1y el puente del emulador de Android (10.0.2.2)
Requisitos previos
- Gateway ejecutándose en otra máquina (o accesible mediante SSH).
- El dispositivo/emulador Android puede alcanzar el WebSocket del gateway:
- Misma LAN con mDNS/NSD, o
- Misma tailnet de Tailscale usando Wide-Area Bonjour / DNS-SD unicast (ver abajo), o
- Host/puerto de gateway manual (alternativa)
- El emparejamiento móvil en tailnet/público no usa endpoints de IP de tailnet sin procesar
ws://. Usa Tailscale Serve u otra URLwss://en su lugar. - La CLI
openclawdisponible en la máquina del gateway (o mediante SSH), para aprobar solicitudes de emparejamiento.
1. Iniciar el Gateway
listening on ws://0.0.0.0:18789
wss:// / https://. Una configuración simple gateway.bind: "tailnet" no basta para el emparejamiento remoto inicial de Android salvo que también termines TLS por separado.
2. Verificar el descubrimiento (opcional)
Desde la máquina del gateway:local. más el dominio de área amplia configurado en una sola pasada, usando el endpoint de servicio resuelto en lugar de sugerencias solo TXT.
Descubrimiento entre redes mediante DNS-SD unicast
El descubrimiento NSD/mDNS de Android no cruza redes. Si el nodo Android y el gateway están en redes distintas pero conectados mediante Tailscale, usa Wide-Area Bonjour / DNS-SD unicast en su lugar. El descubrimiento por sí solo no es suficiente para el emparejamiento de Android por tailnet/público: la ruta descubierta aún necesita un endpoint seguro (wss:// o Tailscale Serve):
- Configura una zona DNS-SD (ejemplo
openclaw.internal.) en el host del gateway y publica registros_openclaw-gw._tcp. - Configura DNS dividido de Tailscale para el dominio elegido apuntando a ese servidor DNS.
3. Conectarse desde Android
En la aplicación Android:- La aplicación mantiene activa su conexión con el gateway mediante un servicio en primer plano (notificación persistente).
- Abre la pestaña Conectar.
- Usa el modo Código de configuración o Manual.
- Si el descubrimiento está bloqueado, usa host/puerto manual en Controles avanzados. Para hosts de LAN privada,
ws://sigue funcionando. Para hosts de Tailscale/públicos, activa TLS y usa un endpointwss:/// Tailscale Serve.
Balizas de presencia activa
Después de que la sesión de nodo autenticada se conecta, y cuando la aplicación pasa a segundo plano mientras el servicio en primer plano sigue conectado, Android llama anode.event con event: "node.presence.alive". El gateway registra esto como lastSeenAtMs/lastSeenReason en los metadatos del nodo/dispositivo emparejado solo después de que se conoce la identidad autenticada del dispositivo de nodo.
La aplicación cuenta la baliza como registrada correctamente solo cuando la respuesta del gateway incluye handled: true. Los gateways antiguos pueden reconocer node.event con { "ok": true }; esa respuesta es compatible, pero no cuenta como una actualización duradera de última vista.
4. Aprobar el emparejamiento (CLI)
En la máquina del gateway:role: node sin ámbitos solicitados. El emparejamiento de operador/navegador y cualquier cambio de rol, ámbito, metadatos o clave pública siguen requiriendo aprobación manual.
5. Verificar que el nodo esté conectado
6. Chat + historial
La pestaña Chat de Android admite selección de sesión (por defectomain, además de otras sesiones existentes):
- Historial:
chat.history(normalizado para visualización: se eliminan las etiquetas de directiva en línea, las cargas XML de llamadas de herramienta en texto sin formato (<tool_call>,<function_call>,<tool_calls>,<function_calls>y variantes truncadas), y los tokens de control del modelo filtrados en ASCII/ancho completo; se omiten las filas de asistente con tokens silenciosos como los exactosNO_REPLY/no_reply; las filas demasiado grandes pueden reemplazarse por marcadores de posición) - Enviar:
chat.send - Actualizaciones push (mejor esfuerzo):
chat.subscribe->event:"chat"
7. Canvas + cámara
Host Canvas del Gateway (recomendado para contenido web)
Para que el nodo muestre HTML/CSS/JS real que el agente pueda editar en disco, apunta el nodo al host de canvas del Gateway.Los nodos cargan canvas desde el servidor HTTP del Gateway (mismo puerto que
gateway.port, predeterminado 18789).- Crea
~/.openclaw/workspace/canvas/index.htmlen el host del gateway. - Navega el nodo hasta él (LAN):
.local, por ejemplo http://<gateway-magicdns>:18789/__openclaw__/canvas/.
Este servidor inyecta un cliente de recarga en vivo en HTML y recarga cuando cambian los archivos. El Gateway también sirve /__openclaw__/a2ui/, pero la aplicación Android trata las páginas A2UI remotas como solo renderizado. Los comandos A2UI con capacidad de acción usan la página A2UI incluida y propiedad de la aplicación.
Comandos de Canvas (solo en primer plano):
canvas.eval,canvas.snapshot,canvas.navigate(usa{"url":""}o{"url":"/"}para volver al andamiaje predeterminado).canvas.snapshotdevuelve{ format, base64 }(format="jpeg"predeterminado).- A2UI:
canvas.a2ui.push,canvas.a2ui.reset(alias heredadocanvas.a2ui.pushJSONL). Estos usan la página A2UI incluida y propiedad de la aplicación para renderizado con capacidad de acción.
camera.snap (jpg), camera.clip (mp4). Consulta Nodo de cámara para parámetros y ayudantes de CLI.
8. Voz + superficie ampliada de comandos de Android
- Pestaña Voz: Android tiene dos modos explícitos de captura. Mic es una sesión manual de la pestaña Voz que envía cada pausa como un turno de chat y se detiene cuando la aplicación deja de estar en primer plano o el usuario sale de la pestaña Voz. Talk es el Talk Mode continuo y sigue escuchando hasta que se desactiva o el nodo se desconecta.
- Talk Mode promociona el servicio en primer plano existente de
connectedDeviceaconnectedDevice|microphoneantes de que empiece la captura y luego lo degrada cuando Talk Mode se detiene. El servicio del nodo declaraFOREGROUND_SERVICE_CONNECTED_DEVICEconCHANGE_NETWORK_STATE; Android 14+ también requiere la declaraciónFOREGROUND_SERVICE_MICROPHONE, el permiso en tiempo de ejecuciónRECORD_AUDIOy el tipo de servicio de micrófono en tiempo de ejecución. - De forma predeterminada, Android Talk usa reconocimiento de voz nativo, chat de Gateway y
talk.speaka través del proveedor de Talk de Gateway configurado. La TTS del sistema local solo se usa cuandotalk.speakno está disponible. - Android Talk usa retransmisión de Gateway en tiempo real solo cuando
talk.realtime.modeesrealtimeytalk.realtime.transportesgateway-relay. - Voice wake está implementado en el código fuente (
VoiceWakeMode), pero el runtime de la aplicación distribuida siempre lo fuerza aoffal conectarse; hoy no hay ningún conmutador visible para el usuario. - Familias adicionales de comandos de Android (la disponibilidad depende del dispositivo, los permisos y la configuración del usuario):
device.status,device.info,device.permissions,device.healthdevice.appssolo cuando Configuración > Capacidades del teléfono > Aplicaciones instaladas está habilitado; enumera de forma predeterminada las aplicaciones visibles en el lanzador (pasaincludeNonLaunchablepara obtener la lista completa).notifications.list,notifications.actions(consulta Reenvío de notificaciones abajo)photos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
Puntos de entrada del asistente
Android permite iniciar OpenClaw desde el disparador del asistente del sistema (Google Assistant). Mantener pulsado el botón de inicio (u otro disparadorACTION_ASSIST) abre la aplicación; decir “Hey Google, ask OpenClaw <prompt>” coincide con el patrón de consulta App Actions declarado por la aplicación y pasa el prompt al compositor de chat sin enviarlo automáticamente.
Esto usa App Actions de Android (capacidad shortcuts.xml) declaradas en el manifiesto de la aplicación. No se necesita configuración del lado del Gateway: la intención del asistente la gestiona por completo la aplicación de Android.
La disponibilidad de App Actions depende del dispositivo, la versión de Google Play Services y de si el usuario ha configurado OpenClaw como la aplicación de asistente predeterminada.
Reenvío de notificaciones
Android puede reenviar notificaciones del dispositivo al Gateway como elementosnode.event. Esto se configura en el dispositivo, en la hoja de configuración de la aplicación, no en la configuración de Gateway/openclaw.json.
| Configuración | Descripción |
|---|---|
| Reenviar eventos de notificación | Conmutador principal. Desactivado de forma predeterminada; requiere que primero se conceda acceso al listener de notificaciones. |
| Filtro de paquetes | Lista de permitidos (solo se reenvían los ID de paquete enumerados) o lista de bloqueados (predeterminado: todos los paquetes excepto los ID enumerados). El propio paquete de OpenClaw siempre se excluye en modo lista de bloqueados para evitar bucles de reenvío. |
| Horas silenciosas | Ventana local de inicio/fin HH:mm que suprime el reenvío. Desactivada de forma predeterminada; una vez habilitada, usa 22:00-07:00 de forma predeterminada. |
| Máx. eventos / minuto | Límite de tasa por dispositivo para notificaciones reenviadas. Valor predeterminado: 20. |
| Clave de sesión de ruta | Opcional. Fija los eventos de notificación reenviados en una sesión específica en lugar de la ruta de notificaciones predeterminada del dispositivo. |
El reenvío de notificaciones requiere el permiso de listener de notificaciones de Android. La aplicación lo solicita durante la configuración.