個別應用程式和委派資料用量監控和追蹤功能,主要仰賴 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,針對每個應用程式中的每個 Socket 追蹤網路流量。系統中每個 Socket 都會與兩個標記元件相關聯。第一個是 UID,可用於明確識別負責資料傳輸的應用程式 (Linux 可將每個網路通訊端的擁有權歸給呼叫應用程式的 UID)。第二個標記元件可用於進一步描述應用程式開發人員指定類別的流量。應用程式可使用這些應用程式層級代碼,將流量分類為多個子類別。
如果應用程式提供網路資料傳輸服務 (例如下載管理工具、媒體串流服務等),則可以使用 TrafficStats.setThreadStatsUid()
函式呼叫,將網路資料傳輸的擁有權歸給要求應用程式的 UID。呼叫端必須具備「android.permission.MODIFY_NETWORK_ACCOUNTING
」權限,才能重新指派網路流量的擁有權。