La funcionalidad de monitoreo y seguimiento del uso de datos delegados/por aplicación se basa en el módulo xt_qtaguid en el kernel de Linux android-3.0 ( kernel/net/netfilter/xt_qtaguid
). La funcionalidad de etiquetado de sockets en el marco ( system/core/libcutils/qtaguid.c
) se basa principalmente en la existencia de la interfaz /proc/net/xt_qtaguid/ctrl
exportada por el módulo del kernel xt_qtaguid
.
El módulo de netfilter quota2
(originalmente parte de xtables-addons
) permite la funcionalidad para establecer límites de cuota con nombre y se amplió para admitir la notificación del espacio de 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 marco también puede especificar reglas adicionales para restringir el tráfico de datos en segundo plano para una aplicación (consulte com.android.server.NetworkManagementSocketTagger.setKernelCounterSet
y android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
).
¿Como funciona?
El módulo qtaguid
netfilter rastrea el tráfico de red por socket para cada aplicación utilizando el UID único de la aplicación propietaria. Hay dos componentes de etiqueta asociados con cualquier socket del sistema. El primero es el UID que identifica de forma única la aplicación responsable de la transferencia de datos (Linux permite atribuir la propiedad de cada socket de red al UID de la aplicación que llama). El segundo componente de etiqueta se utiliza para admitir una caracterización adicional del tráfico en categorías especificadas por el desarrollador de aplicaciones. Al utilizar estas etiquetas a nivel de aplicación, una aplicación puede perfilar el tráfico en varias subcategorías.
En el caso de aplicaciones que brindan transferencia de datos de red como servicio, como el administrador de descargas, el servicio de transmisión de medios, etc., es posible atribuir la propiedad de la transferencia de datos de red al UID de la aplicación solicitante utilizando TrafficStats.setThreadStatsUid()
. TrafficStats.setThreadStatsUid()
Llamada de función. La persona que llama debe tener el permiso " android.permission.MODIFY_NETWORK_ACCOUNTING
" para reasignar la propiedad del tráfico de red.