Platforms overview
Aplicativo Android
Snapshot de suporte
- Função: app de nó complementar (Android não hospeda o Gateway).
- Gateway obrigatório: sim (execute-o no macOS, Linux ou Windows via WSL2).
- Instalação: Google Play para o app, Introdução para o Gateway e depois Pareamento.
- Gateway: Runbook + Configuração.
- Protocolos: Protocolo do Gateway (nós + plano de controle).
Controle do sistema
O controle do sistema (launchd/systemd) fica no host do Gateway. Consulte Gateway.
Runbook de conexão
App de nó Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
O Android se conecta diretamente ao WebSocket do Gateway e usa pareamento de dispositivo (role: node).
Para Tailscale ou hosts públicos, o Android requer um endpoint seguro:
- Preferencial: Tailscale Serve / Funnel com
https://<magicdns>/wss://<magicdns> - Também compatível: qualquer outra URL de Gateway
wss://com um endpoint TLS real ws://em texto claro continua compatível em endereços de LAN privada / hosts.local, além delocalhost,127.0.0.1e a ponte do emulador Android (10.0.2.2)
Pré-requisitos
- Você consegue executar o Gateway na máquina "mestre".
- O dispositivo/emulador Android consegue acessar o WebSocket do gateway:
- Mesma LAN com mDNS/NSD, ou
- Mesma tailnet Tailscale usando Wide-Area Bonjour / DNS-SD unicast (veja abaixo), ou
- Host/porta do gateway manual (fallback)
- O pareamento móvel por tailnet/público não usa endpoints IP de tailnet brutos
ws://. Use Tailscale Serve ou outra URLwss://. - Você consegue executar a CLI (
openclaw) na máquina do gateway (ou via SSH).
1) Inicie o Gateway
openclaw gateway --port 18789 --verboseConfirme nos logs que você vê algo como:
listening on ws://0.0.0.0:18789
Para acesso Android remoto via Tailscale, prefira Serve/Funnel em vez de vincular diretamente à tailnet:
openclaw gateway --tailscale serveIsso dá ao Android um endpoint seguro wss:// / https://. Uma configuração simples gateway.bind: "tailnet" não é suficiente para o primeiro pareamento Android remoto, a menos que você também finalize TLS separadamente.
2) Verifique a descoberta (opcional)
Na máquina do gateway:
dns-sd -B _openclaw-gw._tcp local.Mais notas de depuração: Bonjour.
Se você também configurou um domínio de descoberta de área ampla, compare com:
openclaw gateway discover --jsonIsso mostra local. mais o domínio de área ampla configurado em uma só passagem e usa o endpoint de serviço resolvido em vez de dicas somente TXT.
Descoberta de tailnet (Viena ⇄ Londres) via DNS-SD unicast
A descoberta NSD/mDNS do Android não atravessa redes. Se o nó Android e o gateway estiverem em redes diferentes, mas conectados via Tailscale, use Wide-Area Bonjour / DNS-SD unicast.
A descoberta sozinha não é suficiente para pareamento Android por tailnet/público. A rota descoberta ainda precisa de um endpoint seguro (wss:// ou Tailscale Serve):
- Configure uma zona DNS-SD (exemplo
openclaw.internal.) no host do gateway e publique registros_openclaw-gw._tcp. - Configure o DNS dividido do Tailscale para o domínio escolhido apontando para esse servidor DNS.
Detalhes e exemplo de configuração do CoreDNS: Bonjour.
3) Conecte pelo Android
No app Android:
- O app mantém sua conexão com o gateway ativa por meio de um serviço em primeiro plano (notificação persistente).
- Abra a aba Conectar.
- Use o modo Código de configuração ou Manual.
- Se a descoberta estiver bloqueada, use host/porta manual em Controles avançados. Para hosts de LAN privada,
ws://ainda funciona. Para hosts Tailscale/públicos, ative TLS e use um endpointwss:/// Tailscale Serve.
Após o primeiro pareamento bem-sucedido, o Android se reconecta automaticamente ao iniciar:
- Endpoint manual (se habilitado), caso contrário
- O último gateway descoberto (melhor esforço).
Beacons de presença ativa
Depois que a sessão de nó autenticada se conecta, e quando o app vai para o segundo plano enquanto o serviço em primeiro plano ainda está conectado, o Android chama node.event com event: "node.presence.alive". O gateway registra isso como lastSeenAtMs/lastSeenReason nos metadados do nó/dispositivo pareado somente depois que a identidade autenticada do dispositivo de nó é conhecida.
O app conta o beacon como registrado com sucesso somente quando a resposta do gateway inclui handled: true. Gateways mais antigos podem confirmar node.event com { "ok": true }; essa resposta é compatível, mas não conta como uma atualização durável de último visto.
4) Aprove o pareamento (CLI)
Na máquina do gateway:
openclaw devices listopenclaw devices approve <requestId>openclaw devices reject <requestId>Detalhes de pareamento: Pareamento.
Opcional: se o nó Android sempre se conecta a partir de uma sub-rede rigidamente controlada, você pode optar pela aprovação automática de nó no primeiro pareamento com CIDRs explícitos ou IPs exatos:
{ gateway: { nodes: { pairing: { autoApproveCidrs: ["192.168.1.0/24"], }, }, },}Isso fica desabilitado por padrão. Aplica-se apenas a pareamentos novos com role: node sem escopos solicitados. Pareamento de operador/navegador e qualquer alteração de função, escopo, metadados ou chave pública ainda exigem aprovação manual.
5) Verifique se o nó está conectado
-
Via status dos nós:
bash openclaw nodes status -
Via Gateway:
bash openclaw gateway call node.list --params "{}"
6) Chat + histórico
A aba Chat do Android oferece suporte à seleção de sessão (padrão main, além de outras sessões existentes):
- Histórico:
chat.history(normalizado para exibição; tags de diretivas inline são removidas do texto visível, payloads XML de chamadas de ferramenta em texto simples (incluindo<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>e blocos de chamada de ferramenta truncados) e tokens de controle de modelo ASCII/largura completa vazados são removidos, linhas de assistente compostas apenas por token silencioso, comoNO_REPLY/no_replyexatos, são omitidas, e linhas grandes demais podem ser substituídas por placeholders) - Envio:
chat.send - Atualizações push (melhor esforço):
chat.subscribe→event:"chat"
7) Canvas + câmera
Host Canvas do Gateway (recomendado para conteúdo web)
Se você quiser que o nó mostre HTML/CSS/JS real que o agente possa editar em disco, aponte o nó para o host Canvas do Gateway.
-
Crie
~/.openclaw/workspace/canvas/index.htmlno host do gateway. -
Navegue o nó até ele (LAN):
openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18789/__openclaw__/canvas/"}'Tailnet (opcional): se ambos os dispositivos estiverem no Tailscale, use um nome MagicDNS ou IP da tailnet em vez de .local, por exemplo, http://<gateway-magicdns>:18789/__openclaw__/canvas/.
Esse servidor injeta um cliente de recarregamento ao vivo no HTML e recarrega quando arquivos mudam. O Gateway também serve /__openclaw__/a2ui/, mas o app Android trata páginas A2UI remotas como somente renderização. Comandos A2UI com ações usam a página A2UI empacotada e pertencente ao app antes de aplicar mensagens.
Comandos Canvas (somente em primeiro plano):
canvas.eval,canvas.snapshot,canvas.navigate(use{"url":""}ou{"url":"/"}para retornar ao scaffold padrão).canvas.snapshotretorna{ format, base64 }(padrãoformat="jpeg").- A2UI:
canvas.a2ui.push,canvas.a2ui.reset(alias legadocanvas.a2ui.pushJSONL). Esses comandos usam a página A2UI empacotada e pertencente ao app para renderização com ações.
Comandos de câmera (somente em primeiro plano; protegidos por permissão):
camera.snap(jpg)camera.clip(mp4)
Consulte Nó de câmera para parâmetros e auxiliares de CLI.
8) Voz + superfície expandida de comandos Android
- Aba Voz: o Android tem dois modos explícitos de captura. Microfone é uma sessão manual da aba Voz que envia cada pausa como uma rodada de chat e para quando o app sai do primeiro plano ou quando o usuário sai da aba Voz. Falar é o Modo Falar contínuo e continua ouvindo até ser desativado ou até o nó se desconectar.
- O Modo Falar promove o serviço em primeiro plano existente de
connectedDeviceparaconnectedDevice|microphoneantes do início da captura e depois o rebaixa quando o Modo Falar para. O serviço de nó declaraFOREGROUND_SERVICE_CONNECTED_DEVICEcomCHANGE_NETWORK_STATE; Android 14+ também exige a declaraçãoFOREGROUND_SERVICE_MICROPHONE, a concessão de runtimeRECORD_AUDIOe o tipo de serviço de microfone em runtime. - Por padrão, o Falar do Android usa reconhecimento de fala nativo, chat do Gateway e
talk.speakpelo provedor Falar configurado do gateway. TTS local do sistema é usado somente quandotalk.speaknão está disponível. - O Falar do Android usa relay em tempo real do Gateway somente quando
talk.realtime.modeérealtimeetalk.realtime.transportégateway-relay. - A ativação por voz permanece desabilitada na UX/runtime do Android.
- Famílias adicionais de comandos Android (a disponibilidade depende do dispositivo, permissões e configurações do usuário):
device.status,device.info,device.permissions,device.healthdevice.appssomente quando Configurações > Recursos do telefone > Apps instalados está habilitado; lista apps visíveis no iniciador por padrão.notifications.list,notifications.actions(consulte Encaminhamento de notificações abaixo)photos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
Pontos de entrada do assistente
O Android oferece suporte à inicialização do OpenClaw pelo gatilho do assistente do sistema (Google Assistant). Quando configurado, segurar o botão de início ou dizer "Hey Google, ask OpenClaw..." abre o app e entrega o prompt ao compositor de chat.
Isso usa metadados de App Actions do Android declarados no manifesto do app. Nenhuma configuração extra é necessária no lado do gateway -- a intenção do assistente é tratada inteiramente pelo app Android e encaminhada como uma mensagem de chat normal.
Encaminhamento de notificações
O Android pode encaminhar notificações do dispositivo para o gateway como eventos. Vários controles permitem delimitar quais notificações são encaminhadas e quando.
| Chave | Tipo | Descrição |
|---|---|---|
notifications.allowPackages |
string[] | Encaminhe somente notificações destes nomes de pacote. Se definido, todos os outros pacotes são ignorados. |
notifications.denyPackages |
string[] | Nunca encaminhe notificações destes nomes de pacote. Aplicado depois de allowPackages. |
notifications.quietHours.start |
string (HH:mm) | Início da janela de horas silenciosas (horário local do dispositivo). Notificações são suprimidas durante essa janela. |
notifications.quietHours.end |
string (HH:mm) | Fim da janela de horas silenciosas. |
notifications.rateLimit |
number | Máximo de notificações encaminhadas por pacote por minuto. Notificações excedentes são descartadas. |
O seletor de notificações também usa comportamento mais seguro para eventos de notificação encaminhados, evitando o encaminhamento acidental de notificações sensíveis do sistema.
Exemplo de configuração:
{ notifications: { allowPackages: ["com.slack", "com.whatsapp"], denyPackages: ["com.android.systemui"], quietHours: { start: "22:00", end: "07:00", }, rateLimit: 5, },}