android开发之流量监控
2016-03-21 11:29
495 查看
Android流量监控主要是有两种方法:
1.抓包
这个方法获取的流量更加精准,但是难度应该大点。
2.读取Linux本地文件
Android是基于Linux的一个操作系统
在Android中,用RootExplorer去查看系统文件的话,与流量监控相关的会有这么几个文件
/proc/net/dev这个文件中具体记录的暂时不是非常清楚,可能是整个系统的一个流量情况。
/proc/uid_stat/%d和/proc/uid_stat/%d %d为进程的UID。这个文件里只有两项数据tcp_rcv和tcp_snd。
看命名大家应该就能看出代表什么,一个代表总的接受字节数,一个代表总的发送字节数。
这两个文件为非标准Linux内核文件,由Android内核层/kernel/net/Socket.c的_sock_sendmsg函数负责写入,用户层套接字通信在内核层最终会调用此函数(包括本地套接字和网络套接字)。
而Android在2.3之前是没有封装相应流量监控API的。在2.3之后呢,把数据流量监控封装到了Android.net.TrafficStats类中,其原理就是读取上文提到的那几处文件。其中有的方法也是读取的别的文件。
其主要的方法:
static long getMobileRxBytes()//获取通过Mobile连接收到的字节总数,但不包含WiFi
static long getMobileRxPackets()//获取Mobile连接收到的数据包总数
static long getMobileTxBytes()//Mobile发送的总字节数
static long getMobileTxPackets()//Mobile发送的总数据包数
static long getTotalRxBytes()//获取总的接受字节数,包含Mobile和WiFi等
static long getTotalRxPackets()//总的接受数据包数,包含Mobile和WiFi等
static long getTotalTxBytes()//总的发送字节数,包含Mobile和WiFi等
static long getTotalTxPackets()发送的总数据包数,包含Mobile和WiFi等
static long getUidRxBytes(int uid)获取某个网络UID的接受字节数
static long getUidTxBytes(int uid)获取某个网络UID的发送字节数
返回类型均为long型,如果返回等于-1代表UNSUPPORTED当前设备不支持统计,可能是因为系统版本低。
getUidRxBytes(int uid)此方法就是根据UID去查找系统中相应的文件,并读取相应的值。
这其中可能遇到的问题是:没有WiFi情况下,各进程获得的getUidRxBytes之和与getMobileRxBytes所返回的值不相等。原因在于getUidRxBytes使读取上文提到的文件。而getMobileRxBytes读取的是sys/class/net/rmnet()/statistics/rx_bytes和sys/class/net/ppp()/statistics/rx_bytes。这俩文件。而且在getUidRxBytes返回的值中包含了本地通信的流量,比如本地进程间的socket通信。所以这两个值加起来有所出入。
1.抓包
这个方法获取的流量更加精准,但是难度应该大点。
2.读取Linux本地文件
Android是基于Linux的一个操作系统
在Android中,用RootExplorer去查看系统文件的话,与流量监控相关的会有这么几个文件
/proc/net/dev这个文件中具体记录的暂时不是非常清楚,可能是整个系统的一个流量情况。
/proc/uid_stat/%d和/proc/uid_stat/%d %d为进程的UID。这个文件里只有两项数据tcp_rcv和tcp_snd。
看命名大家应该就能看出代表什么,一个代表总的接受字节数,一个代表总的发送字节数。
这两个文件为非标准Linux内核文件,由Android内核层/kernel/net/Socket.c的_sock_sendmsg函数负责写入,用户层套接字通信在内核层最终会调用此函数(包括本地套接字和网络套接字)。
而Android在2.3之前是没有封装相应流量监控API的。在2.3之后呢,把数据流量监控封装到了Android.net.TrafficStats类中,其原理就是读取上文提到的那几处文件。其中有的方法也是读取的别的文件。
其主要的方法:
static long getMobileRxBytes()//获取通过Mobile连接收到的字节总数,但不包含WiFi
static long getMobileRxPackets()//获取Mobile连接收到的数据包总数
static long getMobileTxBytes()//Mobile发送的总字节数
static long getMobileTxPackets()//Mobile发送的总数据包数
static long getTotalRxBytes()//获取总的接受字节数,包含Mobile和WiFi等
static long getTotalRxPackets()//总的接受数据包数,包含Mobile和WiFi等
static long getTotalTxBytes()//总的发送字节数,包含Mobile和WiFi等
static long getTotalTxPackets()发送的总数据包数,包含Mobile和WiFi等
static long getUidRxBytes(int uid)获取某个网络UID的接受字节数
static long getUidTxBytes(int uid)获取某个网络UID的发送字节数
返回类型均为long型,如果返回等于-1代表UNSUPPORTED当前设备不支持统计,可能是因为系统版本低。
getUidRxBytes(int uid)此方法就是根据UID去查找系统中相应的文件,并读取相应的值。
这其中可能遇到的问题是:没有WiFi情况下,各进程获得的getUidRxBytes之和与getMobileRxBytes所返回的值不相等。原因在于getUidRxBytes使读取上文提到的文件。而getMobileRxBytes读取的是sys/class/net/rmnet()/statistics/rx_bytes和sys/class/net/ppp()/statistics/rx_bytes。这俩文件。而且在getUidRxBytes返回的值中包含了本地通信的流量,比如本地进程间的socket通信。所以这两个值加起来有所出入。
相关文章推荐
- Android getWidth和getMeasuredWidth
- Android的设计模式
- Android--使用XMLPull解析xml
- Android Dalvik虚拟机初识
- Android多种View动画:EasyAndroidAnimations
- Android 总结
- 关于Android开发中Arm、X86和Mips(草稿)
- Android Studio使用总结
- Android下使用正则表达式
- 解决android 单击事件和移动事件的冲突
- Android生成随机数
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- Android中时间处理类
- [IMX6Q][Android5.1]移植笔记 --- Kernel启动无法挂载文件系统
- Android自定义状态栏通知(Status Notification)的正确实现
- 给 Android 开发者的 RxJava 详解
- [Android Studio] FloatingActionButton could not be instantiated
- Android之jni入门
- Android ExpandableListView
- Android GradientDrawable类的详解,设置activity的背景颜色渐变效果