因之前性能脚本针对流量统计在某些机型如(红米 note)上不支持,故对流量部分做了调研和改进
1、 之前统计是 cat proc/uid_stat/(uid#)/tcp_rcv 路径下
adb shell cat proc/uid_stat/(uid#)/tcp_rcv
adb shell cat proc/uid_stat/(uid#)/tcp_snd
对二者求和,劣势是只针对 tcp 协议网络的消耗统计,且在某些机型上不存在该路径。
故进行了优化。
2、 经调查/proc/net/xt_qtaguid/stats 基本覆盖目前所有机型且统计流量全面
adb shell cat /proc/net/xt_qtaguid/stats | grep (uid#)
如: adb shell cat /proc/net/xt_qtaguid/stats | grep 10127
48 wlan0 0x0 10127 0 316574 2279 472562 3651 316574 2279 0 0 0 0 472562 3651 0 0 0 0
49 wlan0 0x0 10127 1 6172960 4936 415951 5215 6172960 4936 0 0 0 0 415951 5215 0 0 0 0
50 wlan0 0x3792d5b400000000 10127 0 29678 208 32168 296 29678 208 0 0 0 0 32168 296 0 0 0 0
51 wlan0 0x3792d5b400000000 10127 1 226170 222 25745 265 226170 222 0 0 0 0 25745 265 0 0 0 0
56 wlan0 0xfa1dcc4b00000000 10127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
57 wlan0 0xfa1dcc4b00000000 10127 1 3014885 2127 139857 2117 3014885 2127 0 0 0 0 139857 2117 0 0 0 0
其中第 6 和 8 列为 rx_bytes(接收数据)和 tx_bytes(传输数据)包含 tcp,udp 等所有网络流量传输的统计。
[具体参考 url:http://stackoverflow.com/questions/12904809/tracking-an-applications-network-statistics-netstats-using-adb]
添加了代码,论坛的兄弟姐妹们可以帮忙参考一下可行性如何
def get_networkTraffic(self):
"""基于UID获取App的网络流量的方法
从/proc/net/xt_qtaguid/stats获取网络流量统计,进行判断,不存在使用之前的方法。
"""
flag_net = self.adb.shell('{0} cat /proc/net/xt_qtaguid/stats'.format(BUSYBOX_PATH),timeout=TIMEOUT)
# print flag_net
if "No such file or directory" not in flag_net:
list_rx = [] # 接收网络数据流量列表
list_tx = [] # 发送网络数据流量列表
str_uid_net_stats = self.adb.shell('{0} cat /proc/net/xt_qtaguid/stats|{0} grep {1}'.format(BUSYBOX_PATH,self.strUID),timeout=ADB_TIMEOUT)
# print str_uid_net_stats
try:
for item in str_uid_net_stats.splitlines():
rx_bytes = item.split()[5] # 接收网络数据流量
tx_bytes = item.split()[7] # 发送网络数据流量
list_rx.append(int(rx_bytes))
list_tx.append(int(tx_bytes))
# print list_rx, sum(list_rx)
floatTotalNetTraffic = (sum(list_rx) + sum(list_tx))/1024.0/1024.0
floatTotalNetTraffic = round(floatTotalNetTraffic,4)
return floatTotalNetTraffic
except:
print "[ERROR]: cannot get the /proc/net/xt_qtaguid/stats, return 0.0"
return 0.0
else:
strTotalTxBytes = self.adb.shell('{0} cat /proc/uid_stat/{1}/tcp_snd'.format(BUSYBOX_PATH,self.strUID),timeout=TIMEOUT)
strTotalRxBytes = self.adb.shell('{0} cat /proc/uid_stat/{1}/tcp_rcv'.format(BUSYBOX_PATH,self.strUID),timeout=TIMEOUT)
try:
floatTotalTraffic = (int(strTotalTxBytes) + int(strTotalRxBytes))/1024.0/1024.0
floatTotalTraffic = round(floatTotalTraffic,4)
return floatTotalTraffic
except:
return 0.0