按应用和委托的数据用量监控与跟踪功能依赖于 android-3.0 Linux 内核中的 xt_qtaguid 模块 (kernel/net/netfilter/xt_qtaguid
)。框架中的套接字标记功能 (system/core/libcutils/qtaguid.c
) 主要依赖于 xt_qtaguid
内核模块导出的 /proc/net/xt_qtaguid/ctrl
接口的存在。
quota2
netfilter 模块(最初是 xtables-addons
的一部分)允许设置命名配额限制的功能,并扩展为支持在达到某些限制时通知用户空间。一旦达到配额限制,quota2
模块将丢弃所有后续网络流量。该框架还可以指定额外的规则来限制应用程序的后台数据流量(请参阅 com.android.server.NetworkManagementSocketTagger.setKernelCounterSet
和 android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
)。
它是如何工作的?
qtaguid
netfilter 模块跟踪每个应用程序的网络流量,以每个套接字为单位,使用拥有应用程序的唯一 UID。系统中任何套接字都有两个标签组件。第一个是 UID,它唯一标识负责数据传输的应用程序(Linux 允许将每个网络套接字的所有权归于调用应用程序的 UID)。第二个标签组件用于支持将流量进一步划分为应用程序开发者指定的类别。使用这些应用程序级别的标签,应用程序可以将流量划分为多个子类别。
对于提供网络数据传输作为服务的应用程序(例如下载管理器、媒体流服务等),可以使用 TrafficStats.setThreadStatsUid()
函数调用将网络数据传输的所有权归于请求应用程序的 UID。调用者必须持有 “android.permission.MODIFY_NETWORK_ACCOUNTING
” 权限才能重新分配网络流量的所有权。