移动互联产品可以随时随地的使用,这个特性带来便利的同时也带来了问题,目前的一段时间内移动网络的带宽还是比较有限的,流量也需要付费,用户自然会关心app使用了多少流量。一些不好的app设计或者缺陷,比如频繁在后台联网去服务端获取信息,可能带来意外的流量,导致用户卸载app或引起投诉。
另外流量的减少不只是减少用户的流量消耗,通常也会因为更少的网络传输带来更好的性能和响应。在移动产品测试中,很有必要对app使用的流量进行度量。大致来说主要是用户操作直接导致的流量和后台即在用户没有直接使用的情况下的流量消耗。
后一种情况在目前的android系统更易出现,目前android的消息推送机制不是借助统一的管道,而是各个app定时启动后台进程到自己的服务端去询问是否有新消息,有就拉去到客户端,而这个询问本身就会带来流量的消耗。
以下方法中的实践数据皆来自网易云课堂和中国大学Mooc。
对于android的app有一些特有的流量测试的方法。
Android系统自带了统计功能。通过直接读取android系统上的两个文件的内容:
Proc/uid_stat/{UID}/tcp_snd和tcp_rcv,其中UID是每个app安装时分配的唯一编号用于识别该app,tcp_snd中的数据表示法术的数据累计大小,单位是字节,tcp_rcv表示接收到的数据累计大小。
通过adb命令进入shell可以获取到这些数据。
首先通过包名获取app的PID:
再访问/proc/{PID}/status文件查找app对应的UID,再查看上述的2个文件:
这个做法也是很多手机安全软件的做能比较简单的给出各个app的流量消耗情况,不过这个方法没有其他维度的区分,只有统计总数据。
还能通过系统API来获取基本的流量数据。TrafficStats类提供了多个方法获取不同角度的流量数据:
还可以在app内部往来访问的接口代码加上相关的统计功能来获取流量的数据。
以上代码中getContentLength获取了本次响应的数据量并在日志打印了出来。
实际应用中很多app会将借口访问的功能做一些封装,上层应用可以复用,针对这些情况可以在借口访问的代码封装中插入流浪统计的功能,可以详细区分每个接口的访问次数和数据量。
但是这种方法统计不到一些系统的DNS等流量,还有不使用接口封装的模块产生的流量会被遗漏。
还有一些通用的流量测试方法主要是在手机上抓包或通过网络代理来统计。
手机抓包
常用的在手机上抓包的工具是wireshark和liunx下的tcpdump。Tcpdump抓包需要root权限,ios的话需要越狱。
在一台root手机上先下载tcpdump可执行文件,通过adb push命令上传到手机上。一般选择/data/local目录,其他目录下的权限问题较多。然后可以进入tcpdump所在目录执行命令抓包了: