流量是指连接网络的设备在网络上所产生的数据流量。
一般分为应用运行期间网卡的下行和上行流量
获取流量方法:
1、流量统计文件:读取读取/proc/net/dev文件
其中 lo 为本地流量, rmnet0为移动流量, wlan0为无线流量
另外网络上还有其他两种本地读取流量的方式
(1)在/sys/class/net/下可以找到相关类别(如rmnet0)的目录.在其子目录statistics下rxbytes和txbytes记录收发流量.
(2)在/proc/uid_stat/{uid}/tcp_rcv记录该uid应用下载流量字节,/proc/uid_stat/{uid}/tcp_snd有该uid应用上传流量字节
但是我的华为手机(1)方式下没有权限,(2)方式下没有uid_stat目录
2、Android流量统计API:
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的发送字节数
3、通过抓包方式 (不做介绍,网上教程的很多)
PerfDog与SoloPi测试结果对比:
下载速率差不多,都在400KB左右(但是SoloPi统计的累计应用上/下 行文件里面显示流量都为0,不知道为什么)
SoloPi源码分析
以累计全局下行流量为例:
RecordPattern pattern = new RecordPattern("累计全局下行流量", "KB", "Network");
pattern.setEndTime(endTime);
pattern.setStartTime(startTime);
result.put(pattern, downloadRecordAll);
数据存储在downloadRecordAll,downloadRecordAll通过getRxAll获取
downloadRecordAll.add(new RecordPattern.RecordItem(System.currentTimeMillis(), getRxAll(), ""