Introdução: por que o Android 9 ainda é importante (mesmo em 2025)
Imagine a situação: você está escrevendo um aplicativo que precisa se comunicar com um servidor usando o bom e velho HTTP. Ou está testando uma API local em localhost. Você executa no Android 9 (Pie) — e obtém uma tela cinza, erro de conexão e um log com a palavra assustadora Cleartext HTTP traffic not permitted. Familiar?
O Android 9 (API 28) foi um ponto de virada: o Google proibiu por padrão conexões HTTP não seguras. Para os desenvolvedores, isso se tornou um desafio. Mesmo em 2025, com o lançamento do Android 14 e 15, milhões de dispositivos ainda rodam o "nove". Além disso, muitos aplicativos corporativos e sistemas legados são forçados a suportar HTTP. O que fazer? Como permitir todos os tipos de conexões de rede HTTP e HTTPS sem comprometer a segurança?
Neste artigo, abordaremos as melhores práticas em Kotlin que realmente funcionam em 2025. Você aprenderá não apenas "como fazer", mas "como fazer corretamente" — para que o Google Play não bloqueie e os usuários não sejam prejudicados.
O que mudou no Android 9: uma breve viagem pela história
Antes do Android 8.1, os desenvolvedores usavam HTTP sem problemas. Mas com o lançamento do Pie, o Google introduziu uma política de segurança que bloqueia o tráfego de texto claro — qualquer tráfego não criptografado via TLS. Isso afetou:
- Requisições HTTP (porta 80);
- WebSocket sem criptografia (ws://);
- Alguns protocolos personalizados.
A exceção é HTTPS (porta 443) e o localhost local. Mas e se o seu servidor ainda estiver rodando em HTTP? Ou se você estiver desenvolvendo um aplicativo para a rede interna da empresa?
A solução é a Network Security Configuration. É um arquivo XML que informa ao sistema: "Ei, este domínio é confiável". Em 2025, este é o padrão de facto, e mostraremos como configurá-lo corretamente.
Método 1: A maneira mais simples — desabilitar a verificação para todo o aplicativo
Se você deseja permitir todos os tipos de conexões de rede HTTP e HTTPS para todo o aplicativo (por exemplo, para um protótipo ou build de teste), pode usar uma flag no manifesto. Mas avisamos: para produção, esta é uma má prática.
Passo 1: Adicione o atributo no AndroidManifest.xml
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:usesCleartextTraffic="true"> ...</application>Passo 2: Certifique-se de que targetSdkVersion = 28 ou inferior
Se targetSdkVersion >= 28, esta flag ainda funciona. Mas o Google Play pode alertar o usuário sobre um aplicativo inseguro. Em 2025, é melhor combinar este método com uma configuração mais refinada.
Prós: rápido, funciona para todos os domínios.
Contras: vulnerabilidade a ataques MitM, não passa na moderação do Google Play.
Método 2: O caminho correto através da Network Security Config (Edição 2025)
Este método é o padrão ouro. Você cria um arquivo XML onde especifica quais domínios e protocolos são permitidos. Em 2025, recomendamos usá-lo para todos os novos projetos.
Passo 1: Crie o arquivo res/xml/network_security_config.xml
Aqui está um exemplo que permite todo HTTP e HTTPS para qualquer domínio (mas com restrições):
<?xml version="1.0" encoding="utf-8"?><network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config></network-security-config>Passo 2: Conecte a config no AndroidManifest
<application android:networkSecurityConfig="@xml/network_security_config" ...></application>Go