Programming/기타

[Android] Traffic Stats Class

라우드니스 2013. 3. 8. 21:53

Traffic Stats Class

 

Android에서 network traffic의 rx/tx 에 관한 정보를 얻어올 수 있게 해주는 class.

 

Network 사용량들은 UID별로 /proc/uid_stat/[UID]/ 에서 파일로 확인할 수 있으며 그렇기 때문에 원하는 process의 정보를 가져오기 위해서는 process의 UID를 알아야 한다. 데이터를 가져오는 함수들은 대부분 native interface로 이루어져 있다.

 

UID: Unix-like OS에서 user에게 할당하는 ID. Android에서는 package를 설치할 시 package에게 User ID를 할당하여 개인적인 저장 공간을 유지할 수 있도록 하고 package를 삭제할 시 UID도 삭제가 된다.

그림 1 Android /proc/uid_stat/[uid]/tcp_rcv

 

TrafficStats의 함수들이 구현돼있는 Native Interface 부분의 Source code는 이 곳 에서 볼 수 있다.

// Per-UID stats require reading from a constructed filename.

static jlong getUidBytes(JNIEnv* env, jobject clazz, jint uid,
                         enum Tx_Rx tx_or_rx, enum Tcp_Udp tcp_or_udp) {
    char tcp_filename[80], udp_filename[80];
    jlong tcp_bytes = -1, udp_bytes = -1, total_bytes = -1;

    switch (tx_or_rx) {
        case TX:
            sprintf(tcp_filename, "/proc/uid_stat/%d/tcp_snd", uid);
            sprintf(udp_filename, "/proc/uid_stat/%d/udp_snd", uid);
            break;
        case RX:
            sprintf(tcp_filename, "/proc/uid_stat/%d/tcp_rcv", uid);
            sprintf(udp_filename, "/proc/uid_stat/%d/udp_rcv", uid);
            break;
        default:
            return -1;
    }

    switch (tcp_or_udp) {
        case TCP:
            tcp_bytes = readNumber(tcp_filename);
            total_bytes = (tcp_bytes >= 0) ? tcp_bytes : -1;
            break;
        case UDP:
            udp_bytes = readNumber(udp_filename);
            total_bytes = (udp_bytes >= 0) ? udp_bytes : -1;
            break;
        case TCP_AND_UDP:
            tcp_bytes = readNumber(tcp_filename);
            total_bytes += (tcp_bytes >= 0 ? tcp_bytes : 0);

            udp_bytes = readNumber(udp_filename);
            total_bytes += (udp_bytes >= 0 ? udp_bytes : 0);
            break;
        default:
            return -1;
    }

    return total_bytes;
}

코드는 tcp / udp의 byte를 얻어오는 Native interface의 함수.


반응형