概要

アプリケーションごとのデータ使用量と委任されたデータ使用量のモニタリングとトラッキングの機能は、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.setKernelCounterSetandroid.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND を参照)。

仕組み

qtaguid netfilter モジュールは、すべてのアプリのネットワーク トラフィックを、ソケットを所有するアプリの一意の UID を使用してソケットごとに追跡します。システムのソケットには、2 つのタグ コンポーネントが関連付けられています。1 つ目は、データ転送を担当するアプリを一意に識別する UID です(Linux では、各ネットワーク ソケットの所有権を呼び出し元アプリの UID に帰属させることができます)。2 つ目のタグ コンポーネントは、詳細な特徴付けによりトラフィックをアプリ開発者が指定したカテゴリに分類する際に使用されます。アプリはこうしたアプリレベルのタグを使用して、トラフィックを複数のサブカテゴリにプロファイルできます。

ダウンロード マネージャーやメディア ストリーミング サービスなど、ネットワーク データ転送をサービスとして提供するアプリの場合、TrafficStats.setThreadStatsUid() 関数呼び出しを使用して、ネットワーク データ転送の所有権をリクエスト元アプリの UID に帰属させることができます。呼び出し元は、ネットワーク トラフィックの所有権を再割り当てするために「android.permission.MODIFY_NETWORK_ACCOUNTING」権限を保持している必要があります。