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 du kernel 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 du kernel xt_qtaguid
.
Le module netfilter quota2
(qui fait à l'origine partie de xtables-addons
) permet de définir des limites de quota nommées. Il a été étendu pour permettre de notifier l'espace utilisateur lorsque certaines limites sont atteintes. Une fois la limite de quota atteinte, le module quota2
supprime 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 par socket pour chaque application à l'aide de l'UID unique de l'application propriétaire. Deux composants de balise sont associés à chaque 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 permet de caractériser davantage le 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 classer le trafic en plusieurs sous-catégories.
Dans le cas d'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 à l'origine de la demande via 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.