アプリごとのデータ使用量と委任されたデータ使用量のモニタリングとトラッキングの機能は、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 を使用して、すべてのアプリのネットワーク トラフィックをソケットごとに追跡します。システムのソケットには、2 つのタグ コンポーネントが関連付けられています。1 つ目は、データ転送を担当するアプリを一意に識別する UID です(Linux では、各ネットワーク ソケットの所有権を呼び出し元アプリの UID に帰属させることができます)。2 つ目のタグ コンポーネントは、アプリ開発者が指定したカテゴリへのトラフィックの、追加の特徴付けをサポートするために使用されます。アプリはこうしたアプリレベルのタグを使用して、トラフィックを複数のサブカテゴリにプロファイリングできます。
ダウンロード マネージャーやメディア ストリーミング サービスなど、ネットワーク データ転送をサービスとして提供するアプリの場合、TrafficStats.setThreadStatsUid()
関数呼び出しを使用して、ネットワーク データ転送の所有権をリクエスト元アプリの UID に帰属させることができます。呼び出し元は、ネットワーク トラフィックの所有権を再割り当てするために「android.permission.MODIFY_NETWORK_ACCOUNTING
」権限を保持している必要があります。