カーネルの概要

アプリごとのデータ使用量と委任されたデータ使用量のモニタリングとトラッキングの機能は、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」権限を保持している必要があります。