Depuração de localhost no Android: reencaminhamento de portas, controladores ADB e a janela RSA em falta
Um botão sobreposto no navegador móvel, uma aplicação Spring Boot protegida por uma barreira OAuth rigorosa e um computador Windows que não reconhece o smartphone. Aquilo que parece uma pequena correção de CSS transforma-se rapidamente numa odisseia de depuração. Uma análise aprofundada para programadores web que enfrentam problemas com o reencaminhamento de portas do Chrome, controladores ADB com falhas e janelas de depuração USB que se recusam a aparecer.
Quem trabalha em desenvolvimento web conhece bem este fenómeno: a aplicação web tem um aspeto excelente no navegador do monitor do computador. A vista móvel nas DevTools do Chrome também não apresenta erros. No entanto, ao abrir a página num smartphone Android real, por exemplo no Edge ou no Chrome, alguns elementos importantes da interface desaparecem subitamente ou os botões ficam sobrepostos.
O problema: erros de CSS, Edge móvel e a armadilha do OAuth
Muitas vezes, o culpado é rapidamente identificado: a propriedade CSS height: 100vh. Os navegadores móveis, sobretudo os que têm uma barra de endereço na parte inferior, como o Edge móvel, calculam frequentemente este valor com base na altura máxima do ecrã. Ao fazê-lo, ignoram a barra de menu dinâmica que aparece e desaparece durante o deslocamento. O resultado: o layout prolonga-se para além da parte inferior da área visível.
Hoje, a solução é geralmente trivial: utilizar height: 100dvh (Dynamic Viewport Height), que tem estas barras corretamente em conta.
Mas como testar esta correção localmente quando a aplicação é mais complexa?
Porque é que o Cloudflare Tunnel falha frequentemente com OAuth
Para testes móveis temporários, muitos programadores recorrem a serviços como os Cloudflare Quick Tunnels (trycloudflare.com). O problema é que estes geram um subdomínio novo e aleatório sempre que são iniciados.
Se a sua aplicação, como um backend Spring Boot, estiver protegida por um início de sessão OAuth2 (Google, GitHub, Auth0), o fornecedor exige um URI de redirecionamento previamente registado de forma rigorosa. Um URL aleatório da Cloudflare provoca um erro «Redirect URI mismatch». Mesmo desativar temporariamente a segurança no código é muitas vezes impossível quando dados essenciais da aplicação, como as funções dos utilizadores, são carregados diretamente a partir do perfil OAuth autenticado.
A solução mais elegante é o reencaminhamento de portas do Chrome através da depuração USB. O smartphone encaminha os seus pedidos pelo cabo USB para o localhost do computador de desenvolvimento. Para o fornecedor OAuth, o redirecionamento continua a ser o localhost:8080 limpo e autorizado.
No entanto, no Windows, o caminho até lá costuma ser acidentado.
Obstáculo 1: o Gestor de Dispositivos do Windows e a ausência de controladores
O primeiro passo lógico leva às opções de programador do dispositivo Android: ativar a depuração USB e ligar o telemóvel ao computador por cabo. Porém, nas DevTools do Chrome, em chrome://inspect/#devices, não aparece absolutamente nada.
Uma consulta ao Gestor de Dispositivos do Windows revela geralmente o problema: embora o smartphone seja reconhecido como dispositivo de armazenamento MTP, a interface de depuração está em falta ou assinalada com um ponto de exclamação amarelo («ADB Interface»). O Windows simplesmente não tem os controladores adequados para a depuração no Android.
Instalar controladores ADB como administrador
Para instalar corretamente o controlador em todo o sistema, é indispensável iniciar o Gestor de Dispositivos com privilégios de administrador. Caso contrário, o Windows impede a atribuição manual do controlador.
- Abra a Linha de Comandos como administrador: Prima a tecla Windows, escreva
cmd, clique com o botão direito do rato em «Linha de Comandos» e selecione «Executar como administrador». - Force a abertura do Gestor de Dispositivos: Introduza o comando
devmgmt.msce prima Enter. - Transfira e instale o controlador: Transfira o Google USB Driver oficial e extraia o ficheiro ZIP.
- No Gestor de Dispositivos, clique com o botão direito do rato no «Dispositivo desconhecido» assinalado com o ponto de exclamação, selecione Atualizar controlador, depois Procurar controladores no meu computador e escolha a pasta que extraiu.
Após a instalação bem-sucedida, o dispositivo deverá aparecer corretamente como «Android Composite ADB Interface».
Obstáculo 2: «Offline» - porque é que a janela de depuração USB não aparece
Os controladores estão instalados e o telemóvel está ligado, mas o Chrome continua a apresentar o dispositivo apenas como Offline em chrome://inspect. E acrescenta a mensagem fatal: «Pending authentication: please accept debugging session on the device.»
Neste momento, deveria aparecer no smartphone a chamada janela RSA: «Permitir depuração USB? A impressão digital da chave RSA do computador é…» Sem esta confirmação criptográfica, o Android bloqueia terminantemente o acesso do computador. Contudo, o ecrã permanece vazio. Nem a revogação das autorizações de depuração nem a utilização de outro smartphone resolvem o problema.
O conflito entre o Chrome e o daemon ADB
A resposta está na arquitetura do Chrome. O navegador inclui a sua própria rotina integrada de deteção USB. Esta depende da comunicação em segundo plano com o daemon ADB (adb.exe, Android Debug Bridge). Contudo, se este serviço em segundo plano não estiver em execução no computador, tiver bloqueado ou o Chrome não tiver permissões para o acionar corretamente, o handshake RSA necessário nunca é enviado pela porta USB.
O smartphone aguarda um pedido de autorização que o computador nunca envia.
A correção: forçar manualmente o handshake ADB
Quando o Chrome falha, é necessário inicializar manualmente a ligação ao hardware através da linha de comandos. Para isso, precisamos das ferramentas oficiais da Google, sem qualquer camada adicional.
Guia passo a passo para resolver o problema
- Transfira as Platform-Tools: Transfira as Android Platform-Tools. Não precisam de ser instaladas. Basta extrair o ficheiro ZIP para uma pasta, por exemplo no Ambiente de Trabalho.
- Verifique o modo MTP no smartphone (importante!): Por motivos de segurança, como a proteção contra «Juice Jacking» em postos de carregamento públicos, as versões modernas do Android bloqueiam as linhas de dados quando o dispositivo está definido como «Apenas carregar». Nas definições USB do telemóvel, selecione obrigatoriamente «Transferência de dados» (MTP).
- Inicie o ADB manualmente: Abra o Explorador de Ficheiros do Windows na pasta para onde extraiu as Platform-Tools. Clique na barra de endereço, na parte superior, escreva
cmde prima Enter. O terminal abre-se exatamente nesse diretório. - O comando decisivo: Introduza o comando seguinte e prima Enter:
adb devices
O que acontece em segundo plano: O sistema apresenta agora: * daemon not running; starting now at tcp:5037. O daemon ADB é forçado a iniciar e procura ativamente nas portas USB. Utiliza o controlador do Windows que foi anteriormente corrigido e envia o handshake RSA para o smartphone.
O resultado: Exatamente no momento em que o comando é executado, aparece no ecrã do smartphone a tão aguardada janela «Permitir depuração USB?».
O final: ativar e testar o reencaminhamento de portas
Depois de confirmar «Permitir sempre a partir deste computador» na janela apresentada no telemóvel, a configuração está concluída:
- Regresse ao Chrome e aceda a
chrome://inspect/#devices. A mensagem «Offline» desapareceu e o dispositivo aparece como ativo. - Junto ao dispositivo, clique em «Reencaminhamento de portas…».
- Introduza a porta
8080ou a porta da sua aplicação Spring Boot. - Introduza
localhost:8080como endereço de destino. - Selecione «Ativar reencaminhamento de portas» e confirme.
Agora, abra o Edge ou o Chrome móvel no smartphone e introduza http://localhost:8080 na barra de endereço. O tráfego é encaminhado em segurança pelo cabo USB para o computador. A aplicação é carregada, o redirecionamento OAuth para localhost funciona perfeitamente, as funções são carregadas corretamente a partir da base de dados e pode finalmente dedicar-se à correção do erro de CSS inicial.
Conclusão: Quando tecnologias web como OAuth e CSS se cruzam com interfaces de hardware como ADB e protocolos USB, os sintomas dos erros são muitas vezes difíceis de interpretar. Uma janela RSA que não aparece raramente significa que o smartphone está avariado; geralmente, indica que o daemon ADB está silenciado. Ter o comando adb devices e o modo de administrador do Gestor de Dispositivos do Windows no seu conjunto de ferramentas evita horas de diagnóstico infrutífero.