La fonctionnalité de surveillance et de suivi de l'utilisation des données par application et déléguée repose sur le module xt_qtaguid dans le noyau Linux android-3.0 (kernel/net/netfilter/xt_qtaguid
). La fonctionnalité de taggage de socket 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 noyau xt_qtaguid
.
Le module netfilter quota2
(qui faisait à l'origine partie de 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 ultérieur. 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 (voir com.android.server.NetworkManagementSocketTagger.setKernelCounterSet
et android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
).
Fonctionnement
Le module netfilter qtaguid
suit le trafic réseau sur une base par socket pour chaque application à l'aide de l'UID unique de l'application propriétaire. Deux composants de tag 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 permettre une caractérisation supplémentaire du trafic dans les catégories spécifiées par le développeur d'applications. À l'aide de ces tags 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, comme 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 demandeur à 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.