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 para um aplicativo é escolhida.

Comportamento de seleção de rede

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

Android 12

Para dispositivos com Android 12 ou superior, o Android usa a classe NetworkScore para selecionar entre as redes disponíveis. Essa classe contém vários sinalizadores necessários para tomar decisões de política. 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 é preferencial quando várias redes do mesmo transporte estão presentes. Um exemplo típico disso é um dispositivo dual-SIM com um interruptor em 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 o sinalizador POLICY_TRANSPORT_PRIMARY em vez de uma rede sem o sinalizador.

Um agente de rede usa o sinalizador POLICY_EXITING para identificar uma rede que deverá se desconectar em breve. Um exemplo típico disso é quando a qualidade de uma rede Wi-Fi diminui à medida que um 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 . Esse sinalizador KEEP_CONNECTED_FOR_HANDOVER é útil para redes em potencial, permitindo que um agente de rede abra 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 em potencial serão desativadas 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 podem atender a uma determinada solicitação e são equivalentes do ponto de vista da política, a seleção prefere a rede que está atendendo a solicitação no momento. Se nenhuma rede estiver atendendo à solicitação, ele escolherá uma das duas, após o que essa rede continuará sendo 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 no AOSP. A lógica de política para seleção de rede é encontrada na classe NetworkRanker e 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 que executam o 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 várias condições, como se a rede é validada ou se a rede é uma VPN. Agentes de rede individuais sincronizam uns com os outros para tomar decisões de política.

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 . Essa classe contém a API e a documentação dos sinalizadores disponíveis e o método setKeepConnectedReason .

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

Exemplos de implementação de agente de rede

AOSP inclui implementações de exemplo de vários agentes de rede. Seguem exemplos de implementações:

  • DcNetworkAgent : usa pontuação de rede para comunicar a política para redes móveis
  • ClientModeImpl.WifiNetworkAgent : usa pontuação de rede para comunicar a política para redes Wi-Fi. Essa implementação inclui compatibilidade retroativa com o inteiro legado para pontuação de rede usando o sinalizador POLICY_EXITING .

Dispositivos atualizando para o 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 inteiro legado usado no Android 11 ou inferior é passado 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 do NetworkScore . O módulo Connectivity Mainline então usa os sinalizadores para tomar a decisão de seleção de rede. Os fabricantes de dispositivos que usam código para Android 11 ou inferior, mas compilando com base na implementação no Android 12, podem esperar erros de compilação, pois os métodos para atualizar o inteiro legado foram removidos no Android 12.

Para agentes de rede que usam a classe interna NetworkFactory , eles devem expressar seu filtro de pontuação em um objeto NetworkScore que representa a pontuação mais forte de uma rede que a fábrica pode criar. Isso ocorre porque no Android 12 a classe NetworkFactory passa apenas solicitações que correspondem aos filtros de pontuação declarados para NetworkFactory em vez de todas as solicitações no Android 11 e inferior.

Recomendamos passar um filtro para implementação mais fácil e economia de 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 normal. Se estiver usando 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, use os seguintes testes:

A implementação incorreta pode resultar no retorno de redes inesperadas 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 usa um retorno de chamada de rede com ConnectivityManager.registerDefaultNetworkCallback ).

Outro possível problema com a implementação incorreta é o consumo grave de bateria causado por um agente de rede sendo criado com uma pontuação que não o qualifica para qualquer solicitação e sendo desativado imediatamente depois. Se o agente for ativado e desativado repetidamente, isso poderá consumir muita bateria.