每個應用程式/委託資料使用監控和追蹤功能都依賴 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-addons
的一部分)允許設定命名配額限制的功能,並進行了擴展以支援在達到某些限制時通知用戶空間。一旦達到配額限制, quota2
模組將丟棄所有後續網路流量。框架也可以指定其他規則來限制應用程式的後台資料流量(請參閱com.android.server.NetworkManagementSocketTagger.setKernelCounterSet
和android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
)。
它是如何運作的?
qtaguid
netfilter 模組使用所屬應用程式的唯一 UID 在每個應用程式的每個套接字的基礎上追蹤網路流量。有兩個標籤組件與系統中的任何套接字相關聯。第一個是 UID,它唯一標識負責資料傳輸的應用程式(Linux 允許將每個網路套接字的所有權歸屬於呼叫應用程式的 UID)。第二個標籤元件用於支援將流量附加表徵為應用程式開發人員指定的類別。使用這些應用程式層級標籤,應用程式可以將流量分為幾個子類別。
對於提供網路資料傳輸作為服務的應用程式(例如下載管理器、媒體串流服務等),可以使用TrafficStats.setThreadStatsUid()
函數呼叫。呼叫者必須持有「 android.permission.MODIFY_NETWORK_ACCOUNTING
」權限才能重新指派網路流量的所有權。