随着人们生活水平的日益提高,手机已经成为了我们生活中的一部分,无论是在家里、工作中、地铁上或是在聚会中等等,都会有手机的身影。所以手机软件也便一步步崛起,购物、外卖、新闻、娱乐、视频等,我们已经离不开APP。
![](http://dingyue.nosdn.127.net/jy9XGITzkUM6pwpgxNZo7zNeJTLPNquY9JKFgpAGnTwWw1536307680457.jpeg)
但APP在带给我们便利的同时也会带来一些不必要的问题,比如:一些不好的app设计或缺陷,有些App会频繁在后台联网去服务端获取信息,可能带来意外的流量,导致用户卸载app或引起投诉,直接影响用户体验,造成不必要的麻烦,因此在移动产品测试中,很有必要对app使用的流量进行度量!
用户没有直接使用的情况在android系统更易出现,因为目前android的消息推送机制不是借助统一的管道,而是各个app定时启动后台进程到自己的服务端去询问是否有新消息,有就拉去到客户端,而这个询问本身就会带来流量的消耗。
对于android的app有一些特有的流量测试的方法。
Android系统自带了统计功能。通过直接读取android系统上的两个文件的内容:
Proc/uid_stat/{UID}/tcp_snd和tcp_rcv,其中UID是每个app安装时分配的唯一编号用于识别该app,tcp_snd中的数据表示法术的数据累计大小,单位是字节,tcp_rcv表示接收到的数据累计大小。
通过adb命令进入shell可以获取到这些数据。
首先通过包名获取app的PID:
![](http://dingyue.nosdn.127.net/auifNJXZlTIQvJ9bshwNHtDCFe9IRvDwLvw5in7UdQeGD1536307681986.png)
再访问/proc/{PID}/status文件查找app对应的UID,再查看上述的2个文件:
![](http://dingyue.nosdn.127.net/A3jxtiYd1ubMtkpaKQM8XdTAg74lvldpoGpsNa0I3=vjT1536307683476.png)
![](http://dingyue.nosdn.127.net/CEAXDEu=U4dXzmtst1dcClXKvj=X5ZAuYIS7GxAX4rQOz1536307684399.png)
这个做法也是很多手机安全软件的做能比较简单的给出各个app的流量消耗情况,不过这个方法没有其他维度的区分,只有统计总数据。
还能通过系统API来获取基本的流量数据。TrafficStats类提供了多个方法获取不同角度的流量数据:
![](http://dingyue.nosdn.127.net/SXyVC3r662Jn8bRQoZwI2JJcIupfQo09niZmi1edWAu311536307685398.png)
还可以在app内部往来访问的接口代码加上相关的统计功能来获取流量的数据。
![](http://dingyue.nosdn.127.net/7ZROgf=Jbkd3ORmRORoAqh9VVFktPE2BWQ4NtJcwpLqXP1536307686821.png)
以上代码中getContentLength获取了本次响应的数据量并在日志打印了出来。
实际应用中很多app会将借口访问的功能做一些封装,上层应用可以复用,针对这些情况可以在借口访问的代码封装中插入流浪统计的功能,可以详细区分每个接口的访问次数和数据量。
但是这种方法统计不到一些系统的DNS等流量,还有不使用接口封装的模块产生的流量会被遗漏。
还有一些通用的流量测试方法主要是在手机上抓包或通过网络代理来统计。
手机抓包
常用的在手机上抓包的工具是wireshark和liunx下的tcpdump。Tcpdump抓包需要root权限,ios的话需要越狱。
在一台root手机上先下载tcpdump可执行文件,通过adb push命令上传到手机上。一般选择/data/local目录,其他目录下的权限问题较多。然后可以进入tcpdump所在目录执行命令抓包了:
![](http://dingyue.nosdn.127.net/nvnyotEoaCt6dpRw6dYNcHp1vmRBVnnKCa4Le69fptij71536307669828.png)
下方这个got的数据会随着访问不断变化。
关于tcpdump的命令可以参考命令手册,不再展开,上面的几个参数的含义:
-s 0:默认抓取长度是68字节,加上-s 0过后可以抓到完整的数据包。
-w ./t1.pcap:将抓到的内容存入t1.pcap文件。
-v:在抓包过程中显示抓到包的数量。就是got旁的数据。
抓包结束后,将t1.pacp传到电脑用pcap分析工具进行查看和分析。
![](http://dingyue.nosdn.127.net/m73Jcmgx5yqMVMdUrbqQmrcq6oS7joSLLSOvMGarww7oC1536307671769.png)
通过http过滤词,筛选出所有的HTTP请求,关注到某一个请求,如图这是晕客厅视频播放时视频资源的一个请求,可以查看对应的请求和响应的数据量,对于length字段。
也可统计所有请求的数据量:
![](http://dingyue.nosdn.127.net/=69yZ5UKLVsdkJP2ACYS=xrfM3uQZI71TWiY5L4=S7iFg1536307673204.png)
WIFI代理抓包
另外对于wifi代理的方式获取流量数据,这个就是我们在实际工作中经常用到的方法,更加简便,对于以http协议为主的系统来说更为合适。
Windows下常用的fiddler和ios下常用的charles,都很常用不做赘述。
另外对于ios的app还可以通过Instrument自带NetWork来查看网络流量,在xcode下打开open菜单选择developer tool打开Instrements,选择network功能即可。
![](http://dingyue.nosdn.127.net/qXRvUmKwwTi5EqsELyLNjkrfI8UQsQhiqGfnoZbJKsRMU1536307674469.png)
![](http://dingyue.nosdn.127.net/iJHgQEiT9vDIS7wGz8UZ2BJnmdeo58Jx1fyPdiHLG61fi1536307675361.png)
可以通过进程方式查看app的网络吞吐和包的数量等,多数情况下看这个维度的数据。(此处使用的是中国大学mooc的数据)
![](http://dingyue.nosdn.127.net/9F3vm400IwR2SVh0jW9D00HvhpFnzkTY0jCFiZI=yuwoc1536307676774.png)
也可以按tcp连接查看不同ip的网络请求流量:
![](http://dingyue.nosdn.127.net/sTuxok2pwyLMcErYxDE2XL6hHGeYVGAfXJ1CHuz7pko=m1536307678696.png)
也可以通过活动的接口查看整体流量,支持wifi和蜂窝网络接口,但无法区分app。
![](http://dingyue.nosdn.127.net/qfV7y442jCOxjUIkbrnvPmXgFrRUKsRjd8aaVZtBDvYO31536307679263.png)
以上是Instruments提供的基本网络流量分析手段,但都是基于TCP/ IP连接来统计的,数据上比HTTP流量统计更精确,特别适合应用蜂窝数据时的流量统计。
最后,我来总结下流量测试可以给我们带来什么?
1.可以让我们很清楚的知道用户在某种场景下使用我们的产品需要消耗多少流量。
2.流量数据分析可以指导我们去做优化。
比如cgi的调用和参数设置是否合理,有些资源或者配置是否可以本地化?
3.流量的优化可以带来速度的优化
减少tcp数据包的个数,或者直接减少请求数都可以带来速度的优化。