Seleção de rede

Esta página descreve como o Android seleciona redes disponíveis simultaneamente. Esse mecanismo de seleção de rede afeta como o Android atende às solicitações de rede do app e do sistema e influencia como a rede padrão de um app é escolhida.

Comportamento de seleção de rede

Esta seção descreve o comportamento de seleção de rede para dispositivos que executam Android 12 ou mais recente e para dispositivos com Android 11 e inferior.

Android 12

Para dispositivos com o Android 12 ou mais recente, o Android usa a classe NetworkScore para selecionar entre as redes disponíveis. Essa classe contém várias flags necessárias para tomar decisões de política. Cada flag representa semanticamente um atributo de uma rede que é importante para a seleção de rede.

Um agente de rede (NetworkAgent) usa a flag POLICY_TRANSPORT_PRIMARY para especificar que a rede é preferencial quando várias redes do mesmo transporte estão presentes. Um exemplo típico disso é um dispositivo dual-SIM com um interruptor nas Configurações para permitir que o usuário escolha qual dos chips usar por padrão. Em um determinado transporte, o Android prefere uma rede com a flag POLICY_TRANSPORT_PRIMARY em vez de uma rede sem a flag.

Um agente de rede usa a flag POLICY_EXITING para identificar uma rede que será desconectada em breve. Um exemplo típico é quando a qualidade de uma rede Wi-Fi se degrada à medida que o usuário se afasta do alcance da rede. O Android evita usar uma rede com essa flag se outra rede sem ela estiver disponível. Cada agente de rede individual pode determinar quando uma rede se degrada o suficiente para ser considerada encerrada.

A classe NetworkScore também permite que um agente de rede declare que uma rede continuar usando o KEEP_CONNECTED_FOR_HANDOVER e o NetworkScore.Builder.setKeepConnectedReason . Isso KEEP_CONNECTED_FOR_HANDOVER é útil para redes em potencial, permitindo que um agente de rede abra uma em uma rede Wi-Fi secundária, sem torná-la a rede principal, o desempenho da rede é avaliado. Se um agente de rede não declarar essa flag, as redes em potencial serão desfeitas por não atender a nenhuma solicitação antes que o agente tenha a chance de avaliar o desempenho de uma rede.

Se duas redes podem atender a uma determinada solicitação e são equivalentes de um ponto de política a seleção dará preferência à rede que está veiculando as solicitação. Se nenhuma rede estiver veiculando a solicitação, ela vai escolher uma das duas. Depois disso, essa rede vai continuar sendo a preferida até que as flags de política mudem.

A implementação do recurso de seleção de rede está na Módulo de conectividade no AOSP. A lógica da política para seleção de rede pode ser encontrada no NetworkRanker e as classes auxiliares dela. Isso significa que os fabricantes de dispositivos não podem personalizar diretamente o código de seleção de rede, mas em vez disso, deve usar os sinalizadores no NetworkScore para transmitir as informações necessárias sobre as redes.

Android 11

Em dispositivos com o Android 11 ou versões anteriores, o Android realiza a seleção de rede com base em um número inteiro simples enviado das implementações de um agente de rede (NetworkAgent). Para cada solicitação, o Android seleciona a rede com a maior pontuação numérica. que podem satisfazer a solicitação. Essa pontuação numérica é composta pelo número inteiro enviado, pelo agente de rede, além de penalidades ou bônus adicionais dadas com base em número de condições. Por exemplo, se a rede é validada ou se o é uma VPN. Os agentes de rede individuais são sincronizados entre si para tomar decisões relacionadas à política.

Se duas redes puderem veicular uma determinada solicitação e tiverem a mesma pontuação numérica, o comportamento será indefinido.

Classe NetworkScore

A classe central do recurso de seleção de rede é NetworkScore Essa classe contém a API e a documentação das flags e setKeepConnectedReason .

A classe NetworkScore precisa ser criada pela classe builder correspondente e ser transmitida ao Construtor NetworkAgent na inicialização. As pontuações de rede podem ser atualizadas a qualquer momento usando o NetworkAgent#sendNetworkScore .

Exemplos de implementação de agentes de rede

O AOSP inclui exemplos de implementação de vários agentes de rede. Confira abaixo exemplos de implementações:

  • TelephonyNetworkAgent: Usa a pontuação de rede para comunicar a política de redes móveis
  • ClientModeImpl.WifiNetworkAgent: Usa a pontuação da rede para comunicar a política de redes Wi-Fi. Essa implementação inclui compatibilidade com o número inteiro legado para pontuação de rede usando a flag POLICY_EXITING.

Dispositivos atualizados para o Android 12

Os fabricantes de dispositivos que estão fazendo upgrade para o Android 12 precisam modificar as implementações do agente de rede para usar a classe NetworkScore. O número inteiro legado usado no Android 11 ou versões anteriores é transmitido em NetworkScore, mas é usado apenas para fins de registro e não-regressão no Android 12. No Android 12, os fabricantes de dispositivos precisam expressar as mudanças desejadas usando sinalizações NetworkScore. O módulo Mainline de conectividade e usa as sinalizações para tomar a decisão de seleção da rede. Dispositivos fabricantes que usam código para o Android 11 ou versões anteriores, mas com base no implementação no Android 12 pode esperar erros de build já que os métodos para atualizar o número inteiro legado foram removidos em Android 12

Para agentes de rede que usam a classe NetworkFactory interna, é necessário expressar o filtro de pontuação em um objeto NetworkScore que represente a pontuação mais alta de uma rede que a fábrica pode criar. Isso ocorre porque, no Android 12, a classe NetworkFactory só transmite as solicitações que correspondem aos filtros de pontuação declarados para NetworkFactory em vez de todas as solicitações no Android 11 e versões anteriores.

Recomendamos passar um filtro para facilitar a implementação e a economia de bateria, assim para que nem todas as solicitações sejam transmitidas para NetworkFactory. No entanto, se suas configurações exige que todas as solicitações sejam transmitidas para NetworkFactory. É possível registrar NetworkFactory.registerIgnoringScore em vez da programação NetworkFactory.register . Se você usar esse método, recomendamos passar um filtro de pontuação que representa com mais precisão a melhor pontuação que a fábrica pode criar para economizar bateria ao não avaliar solicitações que a fábrica não consegue atender.

Validação

Para verificar o comportamento da seleção de rede em um dispositivo Android, use os seguintes testes:

Uma implementação incorreta pode resultar em redes inesperadas sendo retornadas aos apps em resposta ao uso de NetworkCallback, incluindo a seleção da rede padrão do dispositivo (a rede que o sistema envia para o app quando ele usa um callback de rede com ConnectivityManager.registerDefaultNetworkCallback).

Outro possível problema com a implementação incorreta é o consumo excessivo de bateria causado por um agente de rede que é aberto com uma pontuação que não permite a qualificação para nenhuma solicitação e é desativado imediatamente depois. Se o agente e amassados repetidamente, isso pode consumir muita bateria.