Überblick

Die Überwachungs- und Nachverfolgungsfunktion für die anwendungsbezogene/delegierte Datennutzung basiert auf dem xt_qtaguid-Modul im Android-3.0-Linux-Kernel ( kernel/net/netfilter/xt_qtaguid ). Die Socket-Tagging-Funktionalität im Framework ( system/core/libcutils/qtaguid.c ) basiert hauptsächlich auf der Existenz der /proc/net/xt_qtaguid/ctrl Schnittstelle, die vom xt_qtaguid Kernelmodul exportiert wird.

Das Modul quota2 netfilter“ (ursprünglich Teil von xtables-addons ) ermöglicht die Funktionalität zum Festlegen benannter Kontingentgrenzen und wurde erweitert, um die Benachrichtigung des Benutzerbereichs zu unterstützen, wenn bestimmte Grenzen erreicht werden. Sobald das Kontingentlimit erreicht ist, verwirft das quota2 Modul den gesamten nachfolgenden Netzwerkverkehr. Das Framework kann auch zusätzliche Regeln angeben, um den Hintergrunddatenverkehr für eine Anwendung einzuschränken (siehe com.android.server.NetworkManagementSocketTagger.setKernelCounterSet und android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND ).

Wie funktioniert es?

Das qtaguid Netfilter-Modul verfolgt den Netzwerkverkehr pro Socket für jede Anwendung unter Verwendung der eindeutigen UID der besitzenden Anwendung. Jedem Socket im System sind zwei Tag-Komponenten zugeordnet. Die erste ist die UID, die die Anwendung, die für die Datenübertragung verantwortlich ist, eindeutig identifiziert (Linux ermöglicht die Möglichkeit, den Besitz jedes Netzwerk-Sockets der UID der aufrufenden Anwendung zuzuordnen). Die zweite Tag-Komponente wird verwendet, um eine zusätzliche Charakterisierung des Datenverkehrs in vom Anwendungsentwickler festgelegte Kategorien zu unterstützen. Mithilfe dieser Tags auf Anwendungsebene kann eine Anwendung den Datenverkehr in mehrere Unterkategorien profilieren.

Bei Anwendungen, die Netzwerkdatenübertragung als Dienst bereitstellen, wie z. B. dem Download-Manager, Medien-Streaming-Dienst usw., ist es möglich, den Besitz der Netzwerkdatenübertragung mithilfe von TrafficStats.setThreadStatsUid() der UID der anfordernden Anwendung zuzuordnen TrafficStats.setThreadStatsUid() Funktionsaufruf. Der Aufrufer muss über die Berechtigung „ android.permission.MODIFY_NETWORK_ACCOUNTING “ verfügen, um den Besitz des Netzwerkverkehrs neu zuzuweisen.