Selección de red por aplicación (PANS)

Los vehículos dependen cada vez más de la conectividad para administrar la creciente lista de casos de uso que solicitan los OEM y los propietarios de vehículos, lo que genera un mayor espacio en los datos y los costos asociados. Usa la función selección de red por aplicación (PANS) para enrutar el tráfico de apps especificadas en redes pagadas por el OEM.

Con PANS, puedes administrar el volumen y el costo del uso de datos y, al mismo tiempo, brindar una experiencia de automóvil sólida, segura y conectada. PANS:

  • Consiste en una nueva API agregada a ConnectivityManager que solo está disponible para dispositivos automotrices.
  • Proporciona una API de sugerencias de Wi-Fi actualizada (consulta API de sugerencias de Wi-Fi para la conectividad a Internet) para incluir compatibilidad con las capacidades de red de PANS que cambian de forma dinámica.
  • Recopila métricas de respaldo.
  • Proporciona una app de referencia.

¿Por qué usar PANS?

Los PANS pueden hacer lo siguiente:

  • Actualiza de forma dinámica las asignaciones de apps a redes.
  • Administra el enrutamiento a nivel de la app sin hacer cambios en las apps.
  • Solo las apps permitidas por el OEM pueden acceder a las redes del OEM asignadas.
  • Los desarrolladores de apps no necesitan hacer ningún cambio para implementar esta función.
  • Las métricas para el usuario hacen un seguimiento del uso de datos de la app a la red para las redes administradas por OEM.
  • El acceso a la red es seguro y no se puede abusar de él a través de casos de uso no deseados o apps no autorizadas.
  • Los cambios en las asignaciones de apps a redes de PANS se comunican a los usuarios.
  • Se aplica la misma configuración de red a todos los usuarios.

Ventajas principales

PANS ofrece a los OEMs las siguientes ventajas principales:

  1. Los OEMs pueden pagar por el tráfico de red en lugar de los usuarios:
    • Las actualizaciones del sistema se pueden proporcionar sin costo para el usuario.
    • El uso de red de las apps especificadas se puede proporcionar sin costo para el usuario.
    • La telemetría y otras estadísticas se pueden administrar sin costo para el usuario.
  2. Los OEMs pueden garantizar que las apps esenciales permanezcan conectadas incluso sin un plan de datos pagado por el usuario. Por ejemplo, las funciones esenciales de seguridad, como los mapas, el asistente (conducción con manos libres) y las actualizaciones del sistema, siguen funcionando incluso cuando un usuario no tiene un plan de datos.
  3. PANS proporciona un nivel de detalle adicional de control específico para el enrutamiento del tráfico de red en Android. Por ejemplo, los OEMs pueden definir de manera óptima una topología de red lógica para el enrutamiento del tráfico a nivel de la app.

Figura 1. Marco de trabajo de PANS

Implementa PANS

Para implementar PANS, se proporciona una nueva API de ConnectivityManager, setOemNetworkPreference. Esta nueva API asigna apps a un OemNetworkPreference. Esta API solo está disponible para dispositivos automotrices y se anota como una @SystemApi con un nuevo permiso signature.

Figura 2: Implementa PANS

OemNetworkPreference

OemNetworkPreference es una abstracción sobre OEM_PAID y OEM_PRIVATE NetworkCapabilities que asigna apps por nombre de paquete a una preferencia de red. Las preferencias de red permiten jerarquías de red. Por ejemplo, asignar una app a la preferencia OEM_NETWORK_PREFERENCE_OEM_PAID genera la siguiente prioridad de redes predeterminadas asignadas a una app: usar primero una red UNMETERED, si UNMETERED no está disponible, usar una red OEM_PAID y, si OEM_PAID no está disponible, usar la red predeterminada del sistema.

  • OEM_PAID Se usa principalmente para apps que se pueden enrutar en redes OEM y no OEM.
  • OEM_PRIVATE Se usa principalmente para que las apps de OEM accedan a una red dedicada a ellas.
/**
* If an unmetered network is available, use it.
* Otherwise, if a network with the OEM_PAID capability is available, use it.
* Otherwise, use the general default network.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PAID = 1;

/**
* If an unmetered network is available, use it.
* Otherwise, if a network with the OEM_PAID capability is available, use it.
* Otherwise, the app doesn't get a default network.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK = 2;

/**
* Use only NET_CAPABILITY_OEM_PAID networks.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY = 3;

/**
* Use only NET_CAPABILITY_OEM_PRIVATE networks.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY = 4;

Llama a las APIs de PANS

Para usar las APIs de PANS, haz lo siguiente:

  1. Usa OemNetworkPreferences para asignar una app a una preferencia de red.
  2. Llama a setOemNetworkPreference con el objeto OemNetworkPreferences.
  3. Usa la interfaz Runnable para escuchar la finalización de la API.

Por ejemplo:

// Mapping three packages to two network preferences
// Packages have a 1:1 mapping to network preferences
OemNetworkPreferences pref = new OemNetworkPreferences.Builder()
   .addNetworkPreference("first.package.name", OEM_NETWORK_PREFERENCE_OEM_PAID)
   .addNetworkPreference("second.package.name", OEM_NETWORK_PREFERENCE_OEM_PAID)
   .addNetworkPreference("third.package.name", OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY)
   .build();

myConnectivityManager.setOemNetworkPreference(pref, myExecutor, myListener);

Consideraciones

Cuando implementes PANS, ten en cuenta los siguientes puntos:

  • Las preferencias de red no se conservan en los arranques y se deben volver a aplicar en cada uno.
  • Para crear una preferencia para una app, no es necesario que esté instalada. Por lo tanto, las preferencias de red de las apps desinstaladas se pueden establecer de forma proactiva.
  • En cualquier momento, una app solo se puede asignar a una sola preferencia de red.
  • Las preferencias de red se usan para establecer la red predeterminada de una app. Esta es la red que se usa cuando una app no especifica qué redes quiere usar a través de una de las APIs especializadas. Esto no solo cubre la gran mayoría de las necesidades de conectividad, sino que también permite el uso continuo de APIs especializadas, como la API de NetworkRequest, para no interrumpir los casos de uso existentes de la app. Por ejemplo, cuando una app solo quiere realizar una operación en una red sin medición, PANS no la obligará a usar otra red.

Configura una red

Debe haber una red con las capacidades OEM_PAID o OEM_PRIVATE disponible cuando se usa una preferencia de red correspondiente. Android proporciona compatibilidad con la configuración de capacidades para redes Ethernet y Wi-Fi. Para redes Ethernet, puedes usar una superposición de recursos, config_ethernet_interfaces. Esto se establece en el tiempo de compilación.

En el caso de Wi-Fi, la API de WifiNetworkSuggestion se puede usar con las nuevas APIs de Android 12, setOemPaid(Boolean) y setOemPrivate(Boolean). Esto se puede cambiar durante el tiempo de ejecución.

Considera estos ejemplos:

  1. Una superposición de recursos llamada config_ethernet_interfaces especifica lo siguiente:
    • Es el nombre de la interfaz que se configurará.
    • Los valores de NetworkCapabilities deseados
      <!-- 11 NET_CAPABILITY_NOT_METERED
           12 NET_CAPABILITY_INTERNET
           14 NET_CAPABILITY_TRUSTED
           15 NET_CAPABILITY_NOT_VPN
           22 NET_CAPABILITY_OEM_PAID || 26 NET_CAPABILITY_OEM_PRIVATE -->
      <string-array translatable="false" name="config_ethernet_interfaces">
         <item>eth0;11,12,14,15,22;;</item></string-array>
  2. Este WiFiNetworkSuggestion se puede cambiar de forma dinámica:
    ArrayList<WifiNetworkSuggestion> list = new ArrayList<>();
    list.add(new WifiNetworkSuggestion.Builder()
                   .setSsid(WifiInfo.sanitizeSsid(ssid))
                   .setOemPrivate(true)
                   .build());
    mWifiManager.addNetworkSuggestions(list);

Restringe el acceso a las redes PANS

Etiquetar una red con las capacidades OEM_PAID o OEM_PRIVATE la marca como una red restringida. Solo las apps que tengan el permiso CONNECTIVITY_USE_RESTRICTED_NETWORKS, que controlan los OEMs, pueden usar redes restringidas.

Las apps con este permiso pueden usar redes restringidas siempre que las soliciten de forma explícita. Sin embargo, estas apps no tendrán redes restringidas como predeterminadas. Las apps asignadas a través de PANS pueden tener redes OEM restringidas configuradas de forma predeterminada y no necesitarán el permiso de red restringida para usarlas. Cuando PANS asigna una red OEM restringida como su red predeterminada a una app de este tipo, también tiene la capacidad de solicitar explícitamente esa red OEM si la app así lo decide.

Revisa la app de referencia

Se proporciona una app de referencia (incluido el código) llamada NetworkPreferenceApp en las compilaciones de Automotive para depuración de usuarios, que muestra cómo hacer lo siguiente:

  • Consume métricas de PANS.
  • Establece la política de PANS.
  • Establece una política predeterminada para el dispositivo.
  • Borra una política.
  • Aplica una política durante el inicio.
  • Usa la API de Driver Distraction (consulta los Lineamientos de distracción del conductor).
  • Actualiza Wi-Fi de forma dinámica con OEM_PAID y OEM_PRIVATE.

Figura 3: Aplicación de referencia

Métricas

Para facilitar la transparencia en el uso de los datos, se recopilan y ponen a disposición las métricas sobre la cantidad de datos transmitidos a través de las asignaciones de red OEM_PAID y OEM_PRIVATE.

Solución de problemas

La mayoría de las condiciones de solución de problemas surgen de una app que usa la red incorrecta (sin conectividad de red) o de los excesos de datos. Para habilitar las resoluciones rápidas, sigue estos pasos:

  • Connectivity dumpsys incluye una lista de redes predeterminadas activas por app y sus apps asociadas (asignadas desde PANS).
  • Netd dumpsys incluye la IP del UID y las reglas de firewall.
  • Netstats dumpsys incluye métricas de PANS por app. Por ejemplo, qué apps usaron qué red de OEM.

Todos los datos de dumpsys están disponibles si creas un informe de errores de Android.