Qualquer app com a permissão
INTERNET pode acessar dispositivos em uma rede local (LAN).
Isso facilita a conexão dos apps a dispositivos locais, mas também tem
implicações de privacidade, como a formação de uma impressão digital do usuário e a atuação como um
proxy de localização.
O projeto de proteções de rede local visa proteger a privacidade do usuário, restringindo o acesso à rede local com uma nova permissão de execução.
Impacto
No Android 16, essa permissão é um recurso opcional, o que significa que apenas os apps que a ativarem serão afetados. O objetivo da ativação é que os desenvolvedores de apps entendam quais partes do app dependem do acesso implícito à rede local para que possam se preparar para protegê-las com permissão em uma versão futura do Android.
Os apps serão afetados se acessarem a rede local do usuário usando:
- Uso direto ou de biblioteca de soquetes brutos em endereços de rede local, por exemplo,
Multicast DNS (mDNS)ouSimple Service Discovery Protocol (SSDP). - Uso de classes no nível do framework que acessam a rede local, por exemplo,
NsdManager.
Detalhes do impacto
O tráfego de e para um endereço de rede local exige permissão de acesso à rede local. A tabela a seguir lista alguns casos comuns:
| Operação de rede de baixo nível do app | Permissão de rede local necessária |
|---|---|
| Fazer uma conexão TCP de saída | sim |
| Aceitar uma conexão TCP de entrada | sim |
| Enviar um unicast, multicast, broadcast UDP | sim |
| Receber um unicast, multicast, broadcast UDP de entrada | sim |
Essas restrições são implementadas na pilha de rede e, portanto, se
aplicam a todas as APIs de rede. Isso inclui soquetes criados na plataforma
ou no código gerenciado, bibliotecas de rede como Cronet e OkHttp e todas as APIs
implementadas sobre elas. Tentar resolver serviços na rede local
que tenham um sufixo .local exige permissão de rede local.
Exceções às regras anteriores:
- Se o servidor DNS de um dispositivo estiver em uma rede local, o tráfego de / para ele (na porta 53) não exigirá permissão de acesso à rede local.
- Os aplicativos que usam o Output Switcher como seletor no app não precisarão de permissões de rede local (mais orientações serão fornecidas em uma versão posterior).
Aplicação do Android 17
A partir do Android 17, as proteções de rede local são obrigatórias e aplicadas a apps direcionados ao Android 17 ou mais recente.
| Proporção | Android 16 | Android 17 |
|---|---|---|
| SDK de destino | 36 | 37 ou mais recente |
| Permissão | NEARBY_WIFI_DEVICES usado temporariamente | ACCESS_LOCAL_NETWORK |
| Acesso padrão | O acesso à rede local está aberto | A rede local é bloqueada por padrão para todos os apps que atualizam o SDK de destino |
| Grupo de permissões | Parte do grupo de permissões NEARBY_DEVICES atual |
Para verificar se a funcionalidade do app não está quebrada após a aplicação, os aplicativos direcionados ao SDK 37 ou mais recente precisam adotar um dos caminhos a seguir para gerenciar o acesso à rede local:
Caminho A: usar seletores que preservam a privacidade
Para tarefas de descoberta e conexão mediadas pelo sistema, use seletores para evitar solicitar a permissão de execução ampla. Use os seletores a seguir com base no seu caso de uso:
- Transmissão de mídia: para aplicativos que oferecem suporte ao Google Cast, é possível usar
o recurso de seletor de saída. Isso permite que os desenvolvedores permitam que os usuários selecionem dispositivos de transmissão específicos sem que o app precise solicitar a permissão ampla.
ACCESS_LOCAL_NETWORK - Conectividade geral: O
NsdManagerinclui um seletor de serviço executado pelo sistema para descoberta de mDNS. Em vez de o app verificar toda a rede, o sistema mostra uma caixa de diálogo que permite ao usuário selecionar um único dispositivo para o app acessar.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
Caminho B: solicitar permissão de execução (acesso amplo)
Esse caminho é necessário para casos de uso complexos, como automação residencial ou gerenciamento de dispositivos IoT que precisam de acesso amplo e persistente à rede local.
Declarar permissão no manifesto: os desenvolvedores precisam declarar explicitamente
ACCESS_LOCAL_NETWORKnoAndroidManifest.xml.Solicitar permissão no momento da execução:antes de tentar qualquer acesso à rede local, os aplicativos precisam verificar se a permissão foi concedida. Caso contrário, eles precisam chamar
Activity.requestPermission()para acionar o prompt padrão do sistema.Cenário pré-concedido: a permissão
ACCESS_LOCAL_NETWORKfaz parte doNEARBY_DEVICESgrupo de permissões. Se um usuário já tiver concedido outra permissão nesse grupo (como permissões de Bluetooth), ele não receberá um novo prompt para acesso à rede local.Como lidar com a negação e a revogação:os apps precisam lidar normalmente com casos em que o usuário nega a solicitação ou revoga a permissão nas configurações do sistema. Nesses cenários, o tráfego de rede local será bloqueado.
Estratégia de contador de redefinição de solicitação de permissão
A plataforma implementa uma estratégia de redefinição de contador que aborda cenários em que
a negação anterior do grupo de permissões NEARBY_DEVICES de um app
(que agora inclui ACCESS_LOCAL_NETWORK) impediu que o app pedisse
a permissão depois de apresentar adequadamente a justificativa. Esse mecanismo concede
mais oportunidades para o app invocar a API requestPermission(),
redefinindo efetivamente a contagem de negações da permissão ACCESS_LOCAL_NETWORK. Isso permite um novo engajamento mais sutil com o usuário,
especialmente quando a negação inicial ocorreu antes que o app pudesse transmitir a
necessidade de acesso à rede local para a funcionalidade principal.
Modelo de permissão dividida
A permissão de rede local usa uma estratégia de migração de permissão dividida para lidar com aplicativos novos e legados de maneira diferente, com base no SDK de destino.
| Categoria | Nível do SDK de destino | Comportamento de acesso à rede local | Ação necessária do desenvolvedor |
|---|---|---|---|
| Apps novos / atualizados | >= 37 (Android 17) | Bloqueado por padrão | Declarar e solicitar a permissão de execução ACCESS_LOCAL_NETWORK |
| Apps legados | < 37 | Os apps com permissão de INTERNET recebem uma concessão de permissão implícita para ACCESS_LOCAL_NETWORK, permitindo que eles mantenham o acesso. Isso é temporário e será bloqueado por padrão quando o SDK de destino do app for atualizado para 37 |
Nenhuma mudança de código imediata necessária |
Estratégia de LNP por caso de uso
Transmissão: para funcionalidades de transmissão de mídia, a estratégia mais adequada e que preserva a privacidade é usar o seletor de saída. Esse método permite que o sistema processe a descoberta e a conexão de rede local em nome do usuário, eliminando a necessidade de o app solicitar a permissão
ACCESS_LOCAL_NETWORK.Navegadores:o tratamento de erros exige abordagens diferentes com base no protocolo. Os erros de UDP resultam no código de erro
EPERM. Para conexões TCP, os navegadores precisam usar a API NDKandroid_getnetworkblockedreason(int sockFd)para determinar se um pacote foi bloqueado pelo LNP. Essa API retornaANDROID_NETWORK_BLOCKED_REASON_LNP.Outros casos de uso (por exemplo, IoT): os aplicativos que encontram dispositivos usando mDNS precisam usar
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERque permite encontrar dispositivos sem a permissão, eNsdManager#registerServiceInfoCallback/NsdManager#resolveServicepara receber endereços IP. As conexões com endereços IP recebidos dessa forma não exigem aACCESS_LOCAL_NETWORKpermissão.
Para aplicativos que exigem comunicação direta de rede local e não podem
usar seletores mediados pelo sistema, a abordagem sugerida é usar a estratégia de contador de redefinição de permissão. Se a permissão ACCESS_LOCAL_NETWORK for revogada por
o usuário, esse mecanismo vai oferecer mais oportunidades para o app
solicitar a permissão novamente, permitindo que os desenvolvedores apresentem uma justificativa mais clara
para o usuário.
Orientação do Android 16
Para ativar as restrições de rede local, faça o seguinte:
- Atualize o dispositivo para uma versão com o Android 16 Beta 3 ou mais recente.
- Instale o app a ser testado.
Alterne a configuração do Appcompat usando adb.
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>Reinicialize o dispositivo.
Agora, o acesso do app à rede local está restrito, e qualquer tentativa de
acesso à rede local leva a erros de soquete.
Se você estiver usando APIs que executam operações de rede local fora do processo do app (por exemplo, NsdManager), elas não serão afetadas durante a ativação.
Para restaurar o acesso, conceda ao app a permissão NEARBY_WIFI_DEVICES.
- Verifique se o app declara a permissão
NEARBY_WIFI_DEVICESnomanifest. - Acesse Configurações > Apps > [Nome do app] > Permissões > Dispositivos por perto > Permitir.
Agora, o acesso do app à rede local será restaurado, e todos os cenários funcionarão como antes da ativação do app. Veja como o tráfego de rede do app é afetado.
| Permissão | Solicitação de LAN de saída | Solicitação de saída/entrada da Internet | Solicitação de LAN de entrada |
|---|---|---|---|
| Concedido | Works | Works | Works |
| Não concedido | Falhas | Works | Falhas |
Use o comando a seguir para desativar a configuração do Appcompat
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
Erros
Se uma solicitação de acesso à rede local falhar devido à permissão ausente:
As conexões TCP geralmente resultam em um erro de tempo limite.
Erros de UDP e negações de permissão gerais geralmente resultam em um código de erro EPERM.
Bugs
Envie bugs e feedback para:
- Discrepâncias no acesso à LAN (você não acha que um determinado acesso deva ser considerado acesso à "rede local")
- Bugs em que o acesso à LAN deveria ser bloqueado, mas não é
- Bugs em que o acesso à LAN não deveria ser bloqueado, mas é
O seguinte não será afetado por essa mudança:
- Acesso à Internet
- Rede móvel