Android流量监控方法研究

导语:在Android性能测试中,我们经常要对某个android应用进行流量监控测试,从而得出这个应用流量消耗情况。同时,我们也会时常收到用户抱怨,说手机管家流量监控不准 确,甚至有些手机的浮动窗口数值不会变化一直保持为0,但是当我们向开发人员反馈时他们会抱怨说是机型导致这个问题。那么android系统中的流量究竟是如何统计的呢?是不是真和机型相关?下面就让我们来看看android系统的流量统计数据是如何获取的。

1、常用的测试流量方法:

(1)使用wireshark进行抓包:

Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。目前,wireshark主要测试活动有K吧里面提到的手机QQ性能测试和管家流量监控准确性测试。虽然wireshark可以准确统计流量数据,但是如果数据量比较大时就难准确分析,同时据我所知wireshark无法通过命令行来获取某些数据包的流量统计(如果哪位同仁知道怎么处理希望能告诉我J)

(2)通过已有的工具,比如手机管家、360手机卫士或其他统计工具

使用现场工具是最为简便的方法,但并不是每个工具都可以做到100%的准确,比如手机管家是在有浮动窗口情况下3秒刷新一次,通知栏的流量统计是30秒刷新一次。

2、流量数据获取原理:

(1)读取linux本地文件

Android是基于linux的一个操作系统。在Android中,如果用Root Explorer去查看系统文件,与流量监控相关的会有这么几个文件:

① 系统总流量:/proc/net/dev,这个文件中记录的是整个系统的流量情况。

② 单个进程流量:/proc/uid_stat/%d" 和"/proc/uid_stat/%d" %d为进程的UID。这个文件里只有两项数据tcp_rcv和tcp_snd。从命名我们就能看出:tcp_rcv代表总的接收字节数,tcp_snd代表总的发送字节数。

但是,上面的两个流量统计数据都是开机之后累计的数据,也就是说重启手机之后相应的流量数据会自动清零。

对于系统总流量数据,有如下输出格式如图1所示:

图1 Android系统总流量数据

但上图是在WIFI开启的情况下,只有GPRS开启时显示如下图2所示:

图2 在GPRS开启时Android系统中总流量数据

相信大家看了上面的日志会得出eth0是WIFI网络使用的接口,而rmnet0是GPRS使用的接口。但这就是问题所在了,不是所有机器都是用eth0来表示WIFI接口,同样也不是所有rmnet0来表示GPRS, 这些字段的表示都与ROM相关,甚至有些ROM连/proc/net/dev这个文件都没有!如果我们使用的流量监控工具或者程序只适配了这种情况,那么在别的机器上就有可能获取不到流量数据了,从而就有可能导致用户反馈的手机流量数据一直为0的这种情况。

既然不同的ROM可能有不同的字段,那么有没有比较好的办法来做适配呢?据我了解暂时没有,目前比较好的办法是将能收集到的流量字段做成配置文件,然后在读取时去一一匹配,比如配置文件的格式可以如下:

(2)利用系统现有函数

在Android 2.1及以下版本是没有专门的流量统计系统函数,随后在2.2版及后续版本都加入了TrafficStats类,这样就可以轻松获取系统总流量或者单个进程的流量数据。其实,TrafficStats类本身也是读取Linux提供的文件对象系统类型的文本进行解析,其中有的方法也是读取别的文件。TrafficStats类中,提供了多种静态方法,比如getMobileRxByte()可以直接调用获取通过Mobile连接收到的字节总数,getUidRxBytes()返回的是某个进程流量数据,这两个函数返回值均为long型,如果返回等于-1代表 UNSUPPORTED 当前设备不支持统计。

但是需要注意的是,在没有wifi的情况下,各进程获得的getUidRxBytes之和与getMobileRxBytes所返回的值不相等,原因在于getUidRxBytes是读取上文提到的文件,而getMobileRxBytes读取的是sys/class/net/rmnet0/statistics/rx_bytes 和sys/class/net/ppp0/statistics/rx_bytes 这两文件。而且在getUidRxBytes返回的值中包含了本地通信的流量,比如本地进程间的socket通信。所以这两个值加起来有所出入,这也是我们在测试流量统计时偶尔也会遇到的问题,那就是在飞行模式下应用程序也会提示有几十B的2G/3G流量消耗。经过测试,这本地通信的流量值很小,只有几KB甚至几十B.

原文发布于微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文发表时间:2016-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

基于K8S的容器云平台如何部署微服务?

K8S是第一个将“一切以服务为中心,一切围绕服务运转”作为指导思想的创新型产品,它的功能和架构设计自始至终都遵循了这一指导思想,构建在K8S上的系统不仅可以独立...

1.7K80
来自专栏杨建荣的学习笔记

明天,实现几个还不错的功能点

明天,计划实现几个还不错的功能,算是个自己这段时间的运维里程碑划上一个句号。里程碑是自己制定的,目的是督促自己做事情有一个预期目标,在糟糕的实现中不断迭...

12220
来自专栏Python数据科学

Python爬虫之工作篇—寻找你的招聘信息

最近总被智联招聘广发骚扰,烦死个人了简直。索性点进去看了看爬虫工程师现在市场需求到底怎么样了?发展前景如何?看完了之后感觉目前还不错,根据北京来看职位需求还是蛮...

14010

容器服务:来自外部的问好!

容器服务正在改变应用程序的部署方式和管理方式。但容器服务究竟是什么?它与其他传送平台方式有何不同?

19360
来自专栏强仔仔

旅游社交系统

今天给大家介绍一款旅游社交领域的app项目,这个项目是大学一个毕业课设。下面我将从这个项目的构思到项目结项,这一整个过程进行详细的介绍。 项目开始前,首先我...

24060
来自专栏weixuqin 的专栏

django 实现电子支付功能

  思路:调用第三方支付 API 接口实现支付功能。本来想用支付宝来实现第三方网站的支付功能的,但是在实际操作中发现支付宝没有 Python 接口,网上虽然有他...

19720
来自专栏Golang语言社区

Golang语言社区--游戏服务器端开发的一些建议(转载)

大家好,我是Golang语言社区(www.golang.ltd)主编彬哥,本篇给大家转载一篇关于游戏服务器开发的文章。

76370
来自专栏ThoughtWorks

2015.5 技术雷达 | 工具篇

(点击图片可以查看大图) 尽管依赖管理的概念并不新奇,在很多技术栈下它甚至已经被作为一种基础开发实践,但在PHP 社区却并非如此。Composer(getcom...

39050
来自专栏北京马哥教育

从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点。 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在...

75050
来自专栏京东技术

单元测试高效之路——持续集成

互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。

25800

扫码关注云+社区

领取腾讯云代金券