개요

애플리케이션별 데이터 사용량/위임된 데이터 사용량 모니터링 및 추적 기능은 Android-3.0 Linux 커널(kernel/net/netfilter/xt_qtaguid)의 xt_qtaguid 모듈에 의존합니다. 프레임워크(system/core/libcutils/qtaguid.c)의 소켓 태그하기 기능은 xt_qtaguid 커널 모듈에서 내보낸 /proc/net/xt_qtaguid/ctrl 인터페이스의 존재에 주로 의존합니다.

quota2 넷필터 모듈(원래 xtables-addons 일부)은 명명된 할당량 한도를 설정하는 기능을 허용하고 특정 한도에 도달하면 사용자 공간에 알리는 지원으로 확장되었습니다. 할당량 한도에 도달하면 quota2 모듈은 모든 후속 네트워크 트래픽을 삭제합니다. 프레임워크는 추가 규칙을 지정하여 애플리케이션의 백그라운드 데이터 트래픽을 제한할 수도 있습니다(com.android.server.NetworkManagementSocketTagger.setKernelCounterSetandroid.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND 참조).

작동 원리

qtaguid 넷필터 모듈은 소유하는 애플리케이션의 고유 UID를 사용하여 모든 애플리케이션의 소켓별로 네트워크 트래픽을 추적합니다.  시스템의 소켓과 연결된 두 개의 태그 구성요소가 있습니다. 첫 번째 태그 구성요소는 데이터 전송을 담당하는 애플리케이션을 고유하게 식별하는 UID입니다. Linux에서는 각 네트워크 소켓의 소유권이 호출 애플리케이션의 UID에 있다고 지정할 수 있습니다. 두 번째 태그 구성요소는 애플리케이션 개발자가 지정한 카테고리로 트래픽의 특징을 추가로 지정하는 데 사용됩니다. 이러한 애플리케이션 수준 태그를 사용하면 애플리케이션이 트래픽을 여러 하위 카테고리로 프로파일링할 수 있습니다.

다운로드 관리자, 미디어 스트리밍 서비스 등 네트워크 데이터 전송을 서비스로 제공하는 애플리케이션의 경우 TrafficStats.setThreadStatsUid() 함수 호출을 사용하여 네트워크 데이터 전송의 소유권이 요청하는 애플리케이션의 UID에 있다고 지정할 수 있습니다. 호출자는 네트워크 트래픽의 소유권을 다시 할당하는 'android.permission.MODIFY_NETWORK_ACCOUNTING' 권한을 보유해야 합니다.