Kernel-Übersicht

Die Überwachung und Nachverfolgung der App- und delegierten Datennutzung basiert auf dem Modul „xt_qtaguid“ im Android-3.0-Linux-Kernel (kernel/net/netfilter/xt_qtaguid). Die Socket-Tagging-Funktion 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 quota2-Netfilter-Modul (ursprünglich Teil von xtables-addons) ermöglicht es, benannte Kontingentlimits festzulegen. Es wurde erweitert, um den Userspace zu benachrichtigen, wenn bestimmte Limits erreicht werden. Sobald das Kontingentlimit erreicht ist, verwirft das quota2-Modul den gesamten nachfolgenden Netzwerkverkehr. Das Framework kann auch zusätzliche Regeln festlegen, um den Hintergrunddatenverkehr für eine App einzuschränken (siehe com.android.server.NetworkManagementSocketTagger.setKernelCounterSet und android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND).

Wie funktioniert das?

Das qtaguid-Netfilter-Modul überwacht den Netzwerkverkehr für jede App auf Socket-Basis mithilfe der eindeutigen UID der zugehörigen App. Jedem Socket im System sind zwei Tag-Komponenten zugeordnet. Die erste ist die UID, die die App eindeutig identifiziert, die für die Datenübertragung verantwortlich ist. Unter Linux kann die Inhaberschaft jedes Netzwerk-Sockets der UID der anrufenden App zugewiesen werden. Die zweite Tag-Komponente wird verwendet, um den Traffic in von App-Entwicklern angegebene Kategorien zu unterteilen. Mithilfe dieser Tags auf App-Ebene kann der Traffic in mehrere Unterkategorien unterteilt werden.

Bei Apps, die die Netzwerkdatenübertragung als Dienst bereitstellen, z. B. Downloadmanager oder Medienstreamingdienste, kann die Inhaberschaft der Netzwerkdatenübertragung mithilfe des TrafficStats.setThreadStatsUid()-Funktionsaufrufs der UID der anfragenden App zugeordnet werden. Der Aufrufer muss die Berechtigung „android.permission.MODIFY_NETWORK_ACCOUNTING“ haben, um die Inhaberschaft des Netzwerktraffics neu zuzuweisen.