Seleção de rede

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

Comportamento de seleção de rede

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

Andróide 12

Para dispositivos com Android 12 ou superior, o Android usa a classe NetworkScore para selecionar entre as redes disponíveis. Esta classe contém vários sinalizadores necessários para tomar decisões políticas. Cada sinalizador representa semanticamente um atributo de uma rede que é importante para a seleção da rede.

Um agente de rede ( NetworkAgent ) usa o sinalizador POLICY_TRANSPORT_PRIMARY para especificar que a rede é preferida quando diversas redes do mesmo transporte estão presentes. Um exemplo típico disso é um dispositivo dual-SIM com uma opção nas Configurações para permitir que o usuário escolha qual dos cartões SIM usar por padrão. Dentro de um determinado transporte, o Android prefere uma rede com a sinalização POLICY_TRANSPORT_PRIMARY a uma rede sem a sinalização.

Um agente de rede usa o sinalizador POLICY_EXITING para identificar uma rede que deverá ser desconectada em breve. Um exemplo típico disso é quando a qualidade de uma rede Wi-Fi diminui à medida que o usuário sai do alcance da rede. O Android evita usar uma rede com esse sinalizador se outra rede sem esse sinalizador 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 seja mantida usando o sinalizador KEEP_CONNECTED_FOR_HANDOVER e o método NetworkScore.Builder.setKeepConnectedReason . Este sinalizador KEEP_CONNECTED_FOR_HANDOVER é útil para redes em potencial, permitindo que um agente de rede crie uma rede em uma STA Wi-Fi secundária sem torná-la a rede primária até que o desempenho da rede seja avaliado. Se um agente de rede não declarar esse sinalizador, as redes potenciais serão destruídas por não atenderem a nenhuma solicitação antes que o agente tenha a chance de avaliar o desempenho de uma rede.

Se duas redes puderem atender a uma determinada solicitação e forem equivalentes do ponto de vista político, a seleção prefere a rede que atualmente atende a solicitação. Se nenhuma rede estiver atendendo à solicitação, ela escolhe uma das duas, após o que essa rede continua a ser preferida até que os sinalizadores de política sejam alterados.

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

Android 11

Para dispositivos com Android 11 ou inferior, 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 pontuação numérica mais alta que pode atender à solicitação. Essa pontuação numérica é composta pelo número inteiro enviado pelo agente de rede mais bônus ou penalidades adicionais dados com base em uma série de condições, como se a rede é validada ou se a rede é uma VPN. Agentes de rede individuais sincronizam-se entre si para tomar decisões políticas.

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

Classe NetworkScore

A classe central para o recurso de seleção de rede é NetworkScore . Esta classe contém a API e a documentação dos sinalizadores disponíveis e do método setKeepConnectedReason .

A classe NetworkScore deve ser construída por meio de sua classe construtora e passada para o construtor NetworkAgent na inicialização. As pontuações da rede podem ser atualizadas a qualquer momento usando o método NetworkAgent#sendNetworkScore .

Exemplos de implementação de agente de rede

AOSP inclui exemplos de implementações de vários agentes de rede. A seguir estão exemplos de implementações:

  • TelephonyNetworkAgent : usa pontuação de rede para comunicar políticas para redes móveis
  • ClientModeImpl.WifiNetworkAgent : usa pontuação de rede para comunicar políticas para redes Wi-Fi. Esta implementação inclui compatibilidade retroativa com o número inteiro herdado para pontuação de rede usando o sinalizador POLICY_EXITING .

Dispositivos atualizados para Android 12

Os fabricantes de dispositivos que atualizam seus dispositivos para o Android 12 devem modificar suas implementações de agente de rede para usar a classe NetworkScore . O número inteiro legado usado no Android 11 ou inferior é transmitido no NetworkScore , mas é usado apenas para fins de registro e não regressão no Android 12. No Android 12, os fabricantes de dispositivos devem expressar as alterações desejadas usando sinalizadores NetworkScore . O módulo Connectivity Mainline usa então os sinalizadores para tomar a decisão de seleção da rede. Os fabricantes de dispositivos que usam código para Android 11 ou inferior, mas que utilizam a implementação no Android 12, podem esperar erros de compilação, pois os métodos de atualização do número inteiro legado foram removidos no Android 12.

Para agentes de rede que utilizam a classe NetworkFactory interna, eles devem expressar seu filtro de pontuação em um objeto NetworkScore representando a pontuação mais forte de uma rede que a fábrica pode criar. Isso ocorre porque no Android 12 a classe NetworkFactory transmite apenas 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 economizar bateria para que nem todas as solicitações sejam passadas para NetworkFactory . No entanto, se sua implementação personalizada exigir que todas as solicitações sejam passadas para NetworkFactory , você poderá registrar NetworkFactory.registerIgnoringScore em vez do método NetworkFactory.register regular. Se usar esse método, recomendamos passar um filtro de pontuação que represente 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 pode atender.

Validação

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

A implementação incorreta pode resultar no retorno inesperado de redes aos aplicativos em resposta ao uso de NetworkCallback , incluindo a seleção da rede padrão do dispositivo (a rede que o sistema envia ao aplicativo quando ele usa um retorno de chamada de rede com ConnectivityManager.registerDefaultNetworkCallback ).

Outro possível problema com a implementação incorreta é o grave consumo de bateria causado por um agente de rede que recebe uma pontuação que não o permite se qualificar para qualquer solicitação e é desmontado imediatamente depois. Se o agente for levantado e demolido repetidamente, isso poderá consumir muita bateria.