Visão geral do kernel

O monitoramento e o rastreamento do uso de dados por app e delegado dependem do módulo xt_qtaguid no kernel do Linux android-3.0 (kernel/net/netfilter/xt_qtaguid). A funcionalidade de inclusão de tags de soquete no framework (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 do xtables-addons) permite que a funcionalidade defina limites de cota nomeados e foi estendido para oferecer suporte à notificação do espaço do usuário quando determinados limites são atingidos. Quando o limite de cota é atingido, o módulo quota2 descarta todo o tráfego de rede subsequente. O framework também pode especificar outras regras para restringir o tráfego de dados em segundo plano de um app. Consulte com.android.server.NetworkManagementSocketTagger.setKernelCounterSet e android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND.

Como funciona?

O módulo netfilter qtaguid rastreia o tráfego de rede por soquete para cada app usando o UID exclusivo do app proprietário. Há dois componentes de tag associados a qualquer soquete no sistema. O primeiro é o UID, que identifica exclusivamente o app responsável pela transferência de dados. O Linux permite atribuir a propriedade de cada soquete de rede ao UID do app de chamada. O segundo componente de tag é usado para oferecer suporte a mais caracterizações do tráfego em categorias especificadas pelo desenvolvedor do app. Com essas tags no nível do app, um aplicativo pode criar um perfil do tráfego em várias subcategorias.

No caso de apps que oferecem transferência de dados de rede como um serviço, como o gerenciador de downloads, serviço de streaming de mídia etc., é possível atribuir a propriedade da transferência de dados de rede ao UID do app solicitante usando a chamada de função TrafficStats.setThreadStatsUid(). O autor da chamada precisa ter a permissão "android.permission.MODIFY_NETWORK_ACCOUNTING" para reatribuir a propriedade do tráfego de rede.