Visão geral do kernel

A funcionalidade de monitoramento e rastreamento de uso de dados por app e delegado depende 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 netfilter quota2 (originalmente parte de xtables-addons) permite que a funcionalidade defina limites de cota nomeados e foi estendido para notificar o espaço do usuário quando determinados limites forem 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 socket para cada app usando o UID exclusivo do app proprietário. Há dois componentes de tag associados a qualquer socket 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 uma caracterização adicional do tráfego em categorias especificadas pelo desenvolvedor do app. Usando essas tags no nível do app, um app 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, o 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.