Aperçu

La fonctionnalité de surveillance et de suivi de l'utilisation des données par application/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 noyau xt_qtaguid .

Le module quota2 netfilter (qui faisait à l'origine partie de xtables-addons ) permet à la fonctionnalité 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 supprime tout le trafic réseau ultérieur. Le framework peut également spécifier des règles supplémentaires pour restreindre le trafic de données en arrière-plan pour une application (voir com.android.server.NetworkManagementSocketTagger.setKernelCounterSet et android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND ).

Comment ça marche?

Le module qtaguid netfilter suit le trafic réseau par socket pour chaque application en utilisant l'UID unique de l'application propriétaire. Il existe deux composants de balise 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 des catégories spécifiées par le développeur d'applications. À l'aide de ces balises au niveau de l'application, une application peut profiler 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 demandeuse à l'aide de TrafficStats.setThreadStatsUid() appel de fonction. L'appelant doit détenir l'autorisation « android.permission.MODIFY_NETWORK_ACCOUNTING » pour réattribuer la propriété du trafic réseau.