A funcionalidade de monitoramento e rastreamento de uso de dados por aplicativo/delegados depende do módulo xt_qtaguid no kernel Linux Android-3.0 ( kernel/net/netfilter/xt_qtaguid
). A funcionalidade de marcação de soquete na estrutura ( system/core/libcutils/qtaguid.c
) depende principalmente da existência da interface /proc/net/xt_qtaguid/ctrl
exportada pelo módulo do kernel xt_qtaguid
.
O módulo quota2
netfilter (originalmente parte de xtables-addons
) permite que a funcionalidade defina limites de cota nomeados e foi estendido para suportar a notificação do espaço do usuário quando determinados limites são atingidos. Quando o limite da cota for atingido, o módulo quota2
descarta todo o tráfego de rede subsequente. A estrutura também pode especificar regras adicionais para restringir o tráfego de dados em segundo plano para um aplicativo (consulte com.android.server.NetworkManagementSocketTagger.setKernelCounterSet
e android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
).
Como funciona?
O módulo qtaguid
netfilter rastreia o tráfego de rede por soquete para cada aplicativo usando o UID exclusivo do aplicativo proprietário. Existem dois componentes de tag associados a qualquer soquete no sistema. O primeiro é o UID que identifica exclusivamente o aplicativo responsável pela transferência de dados (o Linux permite atribuir a propriedade de cada soquete de rede ao UID do aplicativo chamador). O segundo componente de tag é usado para dar suporte à caracterização adicional do tráfego em categorias especificadas pelo desenvolvedor de aplicativos. Usando essas tags no nível do aplicativo, um aplicativo pode criar o perfil do tráfego em diversas subcategorias.
No caso de aplicativos que fornecem transferência de dados de rede como serviço, como gerenciador de download, serviço de streaming de mídia, etc, é possível atribuir a propriedade da transferência de dados de rede ao UID do aplicativo solicitante usando o TrafficStats.setThreadStatsUid()
chamada de função. O chamador deve ter a permissão “ android.permission.MODIFY_NETWORK_ACCOUNTING
” para reatribuir a propriedade do tráfego de rede.