Présentation du noyau

La fonctionnalité de surveillance et de suivi de la consommation des données par application et déléguée repose sur le module xt_qtaguid du noyau Linux android-3.0 (kernel/net/netfilter/xt_qtaguid). La fonctionnalité de balisage des sockets dans le framework (system/core/libcutils/qtaguid.c) repose principalement sur l'existence de l'interface/proc/net/xt_qtaguid/ctrl exportée par le module de noyauxt_qtaguid.

Le module netfilter quota2 (initialement inclus dans xtables-addons) permet de définir des limites de quota nommées et a été étendu pour prendre en charge la notification de l'espace utilisateur lorsque certaines limites sont atteintes. Une fois la limite de quota atteinte, le module quota2 ignore tout le trafic réseau suivant. Le framework peut également spécifier des règles supplémentaires pour limiter le trafic de données en arrière-plan d'une application (consultez com.android.server.NetworkManagementSocketTagger.setKernelCounterSet et android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND).

Fonctionnement

Le module netfilter qtaguid suit le trafic réseau par socket pour chaque application à l'aide de l'UID unique de l'application propriétaire. Deux composants de balise sont associés à n'importe quel socket du système. Le premier est l'UID, qui identifie de manière unique l'application responsable du transfert de données (Linux permet d'attribuer la propriété de chaque socket réseau à l'UID de l'application appelante). Le deuxième composant de balise est utilisé pour prendre en charge une caractérisation supplémentaire du trafic dans les catégories spécifiées par le développeur de l'application. À l'aide de ces balises au niveau de l'application, une application peut profiler le trafic dans plusieurs sous-catégories.

Dans le cas des applications qui fournissent le transfert de données réseau en tant que service, telles que le gestionnaire de téléchargement, le service de streaming multimédia, etc., il est possible d'attribuer la propriété du transfert de données réseau à l'UID de l'application demanderesse à l'aide de l'appel de fonction TrafficStats.setThreadStatsUid(). L'appelant doit disposer de l'autorisation "android.permission.MODIFY_NETWORK_ACCOUNTING" pour réattribuer la propriété du trafic réseau.