概览

每个应用程序/委托的数据使用监控和跟踪功能依赖于 android-3.0 Linux 内核 ( kernel/net/netfilter/xt_qtaguid ) 中的 xt_qtaguid 模块。框架中的套接字标记功能( system/core/libcutils/qtaguid.c )主要依赖于xt_qtaguid内核模块导出的/proc/net/xt_qtaguid/ctrl接口的存在。

quota2 netfilter 模块(最初是 xtables xtables-addons的一部分)允许设置命名配额限制的功能,并扩展为支持在达到某些限制时通知用户空间。一旦达到配额限制, quota2模块将丢弃所有后续网络流量。框架还可以指定其他规则来限制应用程序的后台数据流量(请参阅com.android.server.NetworkManagementSocketTagger.setKernelCounterSetandroid.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND )。

它是如何工作的?

qtaguid netfilter 模块使用拥有应用程序的唯一 UID 跟踪每个应用程序的每个套接字的网络流量。有两个标签组件与系统中的任何套接字相关联。第一个是唯一标识负责数据传输的应用程序的 UID(Linux 允许将每个网络套接字的所有权归于调用应用程序的 UID)。第二个标签组件用于支持将流量附加到应用程序开发人员指定的类别中。使用这些应用程序级标签,应用程序可以将流量分析为几个子类别。

对于将网络数据传输作为服务提供的应用程序,例如下载管理器、媒体流服务等,可以使用TrafficStats.setThreadStatsUid()将网络数据传输的所有权归属于请求应用程序的 UID TrafficStats.setThreadStatsUid()函数调用。调用者必须持有“ android.permission.MODIFY_NETWORK_ACCOUNTING ”权限才能重新分配网络流量的所有权。