Seleccion de red

Esta página describe cómo Android selecciona entre redes disponibles al mismo tiempo. Este mecanismo de selección de red afecta la forma en que Android cumple con las solicitudes de red del sistema y la aplicación, e influye en cómo se elige la red predeterminada para una aplicación.

Comportamiento de selección de red

Esta sección describe el comportamiento de selección de red para dispositivos con Android 12 o superior y para dispositivos con Android 11 o inferior.

androide 12

Para dispositivos que ejecutan Android 12 o superior, Android usa la clase NetworkScore para seleccionar entre las redes disponibles. Esta clase contiene una serie de indicadores necesarios para tomar decisiones de política. Cada bandera representa semánticamente un atributo de una red que es importante para la selección de la red.

Un agente de red ( NetworkAgent ) usa el indicador POLICY_TRANSPORT_PRIMARY para especificar que se prefiere la red cuando hay varias redes del mismo transporte. Un ejemplo típico de esto es un dispositivo de doble SIM con un interruptor en Configuración que permite al usuario elegir cuál de las tarjetas SIM usar de forma predeterminada. Dentro de un transporte dado, Android prefiere una red con la bandera POLICY_TRANSPORT_PRIMARY sobre una red sin la bandera.

Un agente de red usa el indicador POLICY_EXITING para identificar una red que se espera que se desconecte pronto. Un ejemplo típico de esto es cuando la calidad de una red Wi-Fi se degrada cuando un usuario sale del alcance de la red. Android evita usar una red con esta bandera si hay disponible otra red sin esta bandera. Cada agente de red individual puede determinar cuándo una red se degrada lo suficiente como para que se considere su salida.

La clase NetworkScore también permite que un agente de red declare que una red se mantendrá activa mediante el indicador KEEP_CONNECTED_FOR_HANDOVER y el método NetworkScore.Builder.setKeepConnectedReason . Este indicador KEEP_CONNECTED_FOR_HANDOVER es útil para las posibles redes, lo que permite que un agente de red active una red en una STA Wi-Fi secundaria sin convertirla en la red principal hasta que se evalúe el rendimiento de la red. Si un agente de red no declara este indicador, las posibles redes se deshabilitan por no atender ninguna solicitud antes de que el agente tenga la oportunidad de evaluar el rendimiento de una red.

Si dos redes pueden atender una solicitud determinada y son equivalentes desde el punto de vista de la política, la selección prefiere la red que actualmente atiende la solicitud. Si ninguna red atiende la solicitud, elige una de las dos, después de lo cual esta red continúa siendo preferida hasta que cambien los indicadores de política.

La implementación de la función de selección de red se encuentra en el módulo Conectividad en AOSP. La lógica de la política para la selección de red se encuentra en la clase NetworkRanker y sus clases auxiliares. Esto significa que los fabricantes de dispositivos no pueden personalizar directamente el código de selección de red, sino que deben usar las banderas en NetworkScore para transmitir la información requerida sobre las redes.

androide 11

Para dispositivos que ejecutan Android 11 o versiones anteriores, Android realiza la selección de red en función de un número entero simple enviado desde las implementaciones de un agente de red ( NetworkAgent ). Para cada solicitud, Android selecciona la red con la puntuación numérica más alta que puede satisfacer la solicitud. Esta puntuación numérica se compone del número entero enviado por el agente de la red más bonificaciones o penalizaciones adicionales otorgadas en función de una serie de condiciones, como si la red está validada o si la red es una VPN. Los agentes de red individuales se sincronizan entre sí para tomar decisiones de política.

Si dos redes pueden atender una solicitud determinada y tienen la misma puntuación numérica, el comportamiento no está definido.

Clase de puntuación de red

La clase central para la función de selección de red es NetworkScore . Esta clase contiene la API y la documentación de las banderas disponibles y el método setKeepConnectedReason .

La clase NetworkScore debe construirse a través de su clase constructora y pasarse al constructor NetworkAgent en el momento de la inicialización. Las puntuaciones de red se pueden actualizar en cualquier momento mediante el método NetworkAgent#sendNetworkScore .

Ejemplos de implementación de agentes de red

AOSP incluye implementaciones de ejemplo de varios agentes de red. Las siguientes son implementaciones de ejemplo:

  • DcNetworkAgent : utiliza la puntuación de red para comunicar la política para redes móviles
  • ClientModeImpl.WifiNetworkAgent : utiliza la puntuación de la red para comunicar la política de las redes Wi-Fi. Esta implementación incluye compatibilidad con versiones anteriores con el número entero heredado para la puntuación de red mediante el indicador POLICY_EXITING .

Dispositivos que se actualizan a Android 12

Los fabricantes de dispositivos que actualicen sus dispositivos a Android 12 deben modificar las implementaciones de sus agentes de red para usar la clase NetworkScore . El entero heredado que se usa en Android 11 o versiones anteriores se pasa en NetworkScore , pero solo se usa con fines de registro y de no regresión en Android 12. En Android 12, los fabricantes de dispositivos deben expresar los cambios deseados mediante indicadores de NetworkScore . El módulo Connectivity Mainline luego usa las banderas para tomar la decisión de selección de red. Los fabricantes de dispositivos que usan código para Android 11 o versiones anteriores, pero que se basan en la implementación de Android 12, pueden esperar errores de compilación, ya que los métodos para actualizar el entero heredado se eliminaron en Android 12.

Para los agentes de red que utilizan la clase NetworkFactory interna, deben expresar su filtro de puntaje en un objeto NetworkScore que representa el puntaje más alto de una red que la fábrica puede crear. Esto se debe a que en Android 12, la clase NetworkFactory solo pasa solicitudes que coinciden con los filtros de puntuación declarados en NetworkFactory en lugar de todas las solicitudes en Android 11 y versiones anteriores.

Recomendamos pasar un filtro para una implementación más fácil y ahorro de batería para que no todas las solicitudes pasen a NetworkFactory . Sin embargo, si su implementación personalizada requiere que todas las solicitudes se pasen a NetworkFactory , puede registrar NetworkFactory.registerIgnoringScore en lugar del método NetworkFactory.register normal. Si usa este método, recomendamos pasar un filtro de puntaje que represente con mayor precisión el mejor puntaje que la fábrica puede crear para ahorrar batería al no evaluar las solicitudes que la fábrica no puede cumplir.

Validación

Para verificar el comportamiento de la selección de red en un dispositivo Android, use las siguientes pruebas:

La implementación incorrecta puede provocar que se devuelvan redes inesperadas a las aplicaciones en respuesta a su uso de NetworkCallback , incluida la selección de la red predeterminada del dispositivo (la red que el sistema envía a la aplicación cuando usan una devolución de llamada de red con ConnectivityManager.registerDefaultNetworkCallback ).

Otro posible problema con la implementación incorrecta es el agotamiento severo de la batería causado por un agente de red que aparece con un puntaje que no le permite calificar para ninguna solicitud y se elimina inmediatamente después. Si el agente aparece y se derriba repetidamente, esto podría consumir mucha batería.