Android流量数据获取
很多时候,在我们开发过程中,一款app的流量数据和电量数据没有得到很好的重视,导致后续用户的流量和电量消耗太快,这对用户来说,伤害不小。这两块对于开发app来说,永远是个重大的课题!这里粗略介绍去实现计算一款app的流量消耗的原理。
思路
既然我们要将流量消耗计算出来,现行的方案中,肯定有可以去参考的地方。那么参照什么可以呢?DDMS!

我们看到network模块这里便可以将流量监控起来。看起来还不错!下面就去看它的源码是怎么实现的。
这是源码链接(科学上网!!) DDMS
原理
简单说下介绍下源码,详细大家可以自行下载下来。
在看源码过程中,发现重要一环:


原来是利用adb shell执行这条命令拿到流量数据。就是这么简单!里面再用解析器对输出进行解析!
ok,自己用手机测试一下这条命令!抓到的数据如下图

第一行的几个字段代表什么意思呢?
idx: 对应起来看,这应该就是个索引值
iface: 这是说明出去的网络接口
acct_tag:表示从socket接口出去(计算的时候,这部分也要计算进去)
uid_tag:表示uid值。一般来说,一个app下的所有进程都是共用一个身份id。
cnt_set: 只有0,1两个值。0是后台,1表示前台
Rx Packets:接收数据包
Tx Packets:发送数据包
Rx Bytes:接收比特位
Tx Bytes:发送比特位
基本我们只要需要这四个值就行了。后面的值,聪明人也能猜出八九不离十。如果需求需要更详细,可以就加上去。
实现
既然原理已经比较清楚了,那当我们执行adb shell cat /proc/net/xt_qtaguid/stats
之后只需要按行读取数据,解析出我们需要的流量数据就可以了。那我们需要监控的app该与哪条uid数据进行匹配呢?
小技巧就是:
当app运行起来之后 执行 ps | grep 包名
命令

第二列便是进程id,一个package包名下,可能会有多个进程。没关系,它们出去的流量都是一个身份id,我们只需要记下主进程的 进程id,假设为pid_int,接下来只需要执行cat /proc/pid_int/status
将输出中的Uid解析出来即可。这个就是我们需要用来匹配uid的值
最后,起定时任务,建议可以间隔1-2秒,执行adb shell cat /proc/net/xt_qtaguid/stats
抓取流量数据。将后一次抓到的数据值减去前次周期的值,便是这个时钟周期内的流量数据。数据的单位都是Byte,可以根据需要自行除以1024
匹配的过程中需要注意的是:只要符合我们要抓的APP的Uid的数据,数据我们都要进行叠加!
总结
这是我自己将数据记录出来的,然后图表绘制出来的结果

原理比较简单,大家可以根据需要实现自己需求。其实,能用到的场景还是挺多的。