總覽

每個應用程序/委託的數據使用監控和跟踪功能依賴於 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 ”權限才能重新分配網絡流量的所有權。