Descripción general del kernel

La funcionalidad de supervisión y seguimiento del uso de datos por app y delegados se basa en el módulo xt_qtaguid del kernel de Linux android-3.0 (kernel/net/netfilter/xt_qtaguid). La funcionalidad de etiquetado de sockets en el framework (system/core/libcutils/qtaguid.c) se basa principalmente en la existencia de la interfaz /proc/net/xt_qtaguid/ctrl que exporta el módulo del kernel xt_qtaguid.

El módulo quota2 de netfilter (originalmente parte de xtables-addons) permite que la funcionalidad establezca límites de cuota con nombre y se extendió para admitir la notificación del espacio del usuario cuando se alcanzan ciertos límites. Una vez que se alcanza el límite de cuota, el módulo quota2 descarta todo el tráfico de red posterior. El framework también puede especificar reglas adicionales para restringir el tráfico de datos en segundo plano de una app (consulta com.android.server.NetworkManagementSocketTagger.setKernelCounterSet y android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND).

¿Cómo funciona?

El módulo qtaguid netfilter hace un seguimiento del tráfico de red por socket para cada app que usa el UID único de la app propietaria. Hay dos componentes de etiquetas asociados con cualquier socket del sistema. El primero es el UID, que identifica de forma única la app responsable de la transferencia de datos (Linux permite atribuir la propiedad de cada socket de red al UID de la app que realiza la llamada). El segundo componente de la etiqueta se usa para admitir la caracterización adicional del tráfico en categorías especificadas por el desarrollador de la app. Con estas etiquetas a nivel de la app, una app puede crear perfiles del tráfico en varias subcategorías.

En el caso de las apps que proporcionan transferencia de datos de red como un servicio, como el administrador de descargas, el servicio de transmisión de contenido multimedia, etcétera, es posible atribuir la propiedad de la transferencia de datos de red al UID de la app solicitante con la llamada a la función TrafficStats.setThreadStatsUid(). El llamador debe tener el permiso “android.permission.MODIFY_NETWORK_ACCOUNTING” para reasignar la propiedad del tráfico de red.