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의 함수.
반응형
'Programming > 기타' 카테고리의 다른 글
Performance Evaluation of In-Memory Computing on Scale-Up and Scale-Out Cluster (0) | 2016.08.06 |
---|---|
HiBench 5.0 간략 설명 (0) | 2016.01.24 |
DBT-2를 ubuntu 13.10 64bit에서 컴파일 시 (0) | 2013.12.14 |
[Android]CPU의 가능한 Hz, mode와 현재 상태 구하기 (0) | 2013.03.11 |
[Android]어플리케이션이 내부 미디어플레이어를 이용할 때 네트워크 사용량 측정법? (0) | 2013.03.09 |