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 solicitados por los fabricantes de equipos originales y los propietarios de vehículos, lo que genera una mayor huella de datos y costos asociados. Usa la función de 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 robusta, segura y conectada en el automóvil. PANS:

  • Consiste en una nueva API agregada a ConnectivityManager disponible solo para dispositivos automotrices.
  • Se proporciona una API de sugerencia de Wi-Fi actualizada (consulta API de sugerencia 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é se produce el PANS?

El PANS puede hacer lo siguiente:

  • Actualizar de forma dinámica las asignaciones de la app a la red
  • 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 realizar ningún cambio para implementar esta función.
  • Las métricas orientadas al usuario hacen un seguimiento del uso de datos de la app a la red para las redes administradas por el 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.
  • Se les comunica a los usuarios los cambios en las asignaciones de la app a la red de PANS.
  • Se aplica la misma configuración de red a todos los usuarios.

Ventajas principales

El PANS proporciona a los OEM estas ventajas principales:

  1. Los OEM pueden pagar 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 otros análisis se pueden administrar sin costo para el usuario.
  2. Los OEM pueden garantizar que las apps críticas permanezcan conectadas incluso sin un plan de datos pagado por el usuario. Por ejemplo, las funciones críticas para la 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 control adicional específico para el enrutamiento del tráfico de red en Android. Por ejemplo, los OEM pueden definir de manera óptima una topología de red lógica para el enrutamiento del tráfico a nivel de la app.

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 @SystemApi con un nuevo permiso signature.

OemNetworkPreference

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

  • OEM_PAID Se usa principalmente para las apps que se pueden enrutar en redes de OEM y que no son de OEM.
  • OEM_PRIVATE Se usa principalmente para que las apps de OEM obtengan acceso 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 persisten en los reinicios y deben volver a aplicarse en cada reinicio.
  • Para crear una preferencia para una app, no es necesario que esté instalada. Por lo tanto, las preferencias de red para 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 especificó 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.

Cómo configurar una red

Debe haber disponible una red con las capacidades OEM_PAID o OEM_PRIVATE cuando se use una preferencia de red correspondiente. Android admite la configuración de capacidades para redes Ethernet y Wi-Fi. Para las redes Ethernet, puedes usar una superposición de recursos, config_ethernet_interfaces. Este valor se establece en el momento de la 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 en el tiempo de ejecución.

Considera los siguientes ejemplos:

  1. Una superposición de recursos llamada config_ethernet_interfaces especifica lo siguiente:
    • Nombre de la interfaz que se configurará.
    • Son 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 de PANS

Etiquetar una red con las capacidades OEM_PAID o OEM_PRIVATE la marca como una red restringida. Las redes restringidas solo pueden ser usadas por apps que tengan el permiso CONNECTIVITY_USE_RESTRICTED_NETWORKS, que controlan los OEM.

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

Revisa la app de referencia

En las compilaciones automotrices de depuración del usuario, se proporciona una app de referencia (incluido el código) llamada NetworkPreferenceApp que muestra cómo hacer lo siguiente:

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

Métricas

Para facilitar la transparencia en torno al uso de datos, se recopilan y se ponen a disposición métricas sobre la cantidad de datos transmitidos a través de las asignaciones de red de 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 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 reglas de firewall y de IP del UID.
  • 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.