應用程式專屬和委派的資料用量監控與追蹤功能,依賴 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()
函式呼叫,將網路資料傳輸的擁有權歸給要求應用程式的 UID。呼叫者必須擁有「android.permission.MODIFY_NETWORK_ACCOUNTING
」權限,才能重新指派網路流量擁有權。