文档章节

android应用流量统计小谈

TiHou
 TiHou
发布于 2013/11/26 11:08
字数 929
阅读 1.6W
收藏 17

    最近有一个项目需要对android设备上安装的应用进行流量统计,并且分离出每个应用通过wifi和手机网络分别用了多少流量。花了一些时间查阅资料和代码编写,终于完成了一个DEMO版本,最后做了一些封装,将这个功能组件化,以后需要这个功能只要把jar导进去就可以了。那么,对于这一个需求,我们应该怎么做呢?

    谈到流量统计,先给大家介绍篇入门文章http://keepcleargas.bitbucket.org/2013/10/12/android-App-Traffic.html,这篇文章详细阐述了在android文件系统中,关于安装应用的流量统计文件位置,以及如何看这个文件。另外,文章还介绍了单个应用的流量统计文件位置。这里,文章谈到了TrafficStats这个类。TrafficStats是android.net包下的一个工具类,里面有一些静态方法,可以用来获取应用的流量使用情况。值得注意的是,所有获得的值都是从开机到当前时刻的流量值,这一点很重要。因此,我们在做统计的是后,就需要用到数据库,在手机关机的时候,先把值持久化下来。接下来,我们重点看TrafficStats这个类的其中两个静态方法getUidRxBytes(int uid)和getUidTxBytes(int uid)。这两个方法分别获取相应uid所代表的应用的流量接收字节数和流量发送字节数。而,应用的uid我们可以通过应用的包名得到PackageInfo,在从PackageInfo中提取它的uid。我们只要将得到的rx和tx相加就得到应用使用的流量了。

    通过上面的方法,我们只能得到应用所使用的总流量。但是,如何分离出其中有多少是通过wifi使用的,多少是通过手机网络的呢?这里,我们需要借助android的广播机制。通过监听手机的wifi切换情况,当wifi从关闭状态切换到开启状态时,就开始统计wifi流量;当wifi从开启状态切换到关闭状态时,就结束wifi流量统计;另外,上面已经提到,我们用TrafficStats得到的流量值是用户开机到当前的流量统计值。因此,我们还需要另一个广播来监听用户手机的关机。

    看起来,原理很简单,但是里面有许多细节需要我们考虑:

  1. 用户安装了使用流量统计功能的应用之前,其他需要统计流量的应用已经有流量统计值了,我们是无法分离出之前这部分的wifi和手机网络流量值的。我们要将这部分去除。也就是说,从安装我们的功能应用是开始统计。

    最后贴一些我的组件下载地址:http://download.csdn.net/detail/hatah0126/6611873。由于我们的组件需要数据库来存储,因此还依赖了另一个jar:http://download.csdn.net/detail/hatah0126/6611911。使用时,把这两个jar放到libs目录下。另外,在eclipse的java Build Path->order and Export中,记得把他们勾上,新版的eclipse如果没勾的话会出问题。

    最最后一步,就是在我们项目的AndroidManifest.xml上做一些权限和广播的配置即可,将下面的代码贴到你的AndroidManifest.xml。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>



<receiver android:name="cn.wth.trafic.receiver.DeviceShutDownReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.ACTION_SHUTDOWN"/>
            </intent-filter>
        </receiver>
        
        <receiver android:name="cn.wth.trafic.receiver.WifiStateReceiver">
            <intent-filter >
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
            </intent-filter>
        </receiver>



    OK,大功告成,文章写得不好,但均是原创,大神勿喷,初学者可参考借鉴。


© 著作权归作者所有

TiHou
粉丝 2
博文 7
码字总数 2030
作品 0
福州
程序员
私信 提问
加载中

评论(9)

-飞客-
-飞客-
在 GIT@OSC 上 搞成一个 开源的 项目多好啊
garybook
garybook
貌似getUidRxBytes(int uid)和 getUidTxbytes(int uid)无法统计该应用视频播放的流量
c
closeyss
还有个疑问 就是关机广播中执行的数据操作,有时候还没执行完,手机i就完全关机了,这可能也会引起数据统计出现问题,不知道LZ是怎么解决这些问题的,希望有时间可以指教一下!83
c
closeyss
楼主 确定这里面的算法是准确的吗 为什么我在wifi状态下统计了数据之后,再重新启动,统计的数据中3g网络也有值了?还有个疑问TraficUtil中的getTraficInfo(Context context)用什么方式调用,是每隔几秒钟执行一次吗30 求解啊
c
closeyss
0LZ 有木有开源的DEMO开源开源 ,这两天正在倒腾这个,希望可以借鉴你的深入学习学习
TiHou
TiHou 博主

引用来自“王轶鸣”的评论

请问,为什么在设备没有插入SIM卡的时候,3G流量会被记录为-109,当我插入SIM卡的时候,3G流量开始累积了,但是会从-109开始累加上去,当我再次拔掉我的3G卡时,流量又被记录为-109。由于使用的您提供的jar,也不知道具体如何去修改。能不能给一个方法。

不好意思哈,没有考虑过拔插SIM卡会出现情况,这几天比较忙,等我有空看下,问题解决后会回复你。
王轶鸣
请问,为什么在设备没有插入SIM卡的时候,3G流量会被记录为-109,当我插入SIM卡的时候,3G流量开始累积了,但是会从-109开始累加上去,当我再次拔掉我的3G卡时,流量又被记录为-109。由于使用的您提供的jar,也不知道具体如何去修改。能不能给一个方法。
t
tqzym
214710490@qq.com
t
tqzym
79
你好 ,可否给出android应用流量统计的源码吗? 多谢啊
Android TrafficStats流量监控

一、流量监控TrafficStats 对于Android流量统计来说在2.2版中新加入了TrafficStats类可以轻松获取,其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析。android.net...

IamOkay
2014/11/14
1.7K
0
Android性能专项测试之耗电量统计

电量统计(1)-原理- http://duanqz.github.io/2015-07-21-batterystats-part1 Android性能专项测试之耗电量统计API- https://blog.csdn.net/itfootball/article/details/49155979 -- Android......

desaco
2019/02/13
0
0
Android基础性能数据获取(api或/proc/读取)

主要资料参考 Android系统源码在线查看网址 Linux平台Cpu使用率的计算 腾讯开源移动端性能测试APP:GT 3.1 内存篇 内存:表示当前进程内存的使用情况,内存占用过高可能会引起内存抖动,或O...

某杰
2018/05/07
0
0
安卓APP测试流程与技术知识大全介绍--可用于面试储备

----------全-----有不足/遗漏请补充------- 一、安卓系统知识概述 1.1 安卓系统架构 1.2 安卓权限系统 Android操作系统其实是一个多用户的linux操作系统,每个android应用使用不同的用户,运...

享有~邓盛誉~之名
04/01
0
0
Emmagee 2.4.1 发布,Android 性能测试工具

Emmagee 是网易杭州研究院 QA团队开发的一款简单易上手的Android性能监控App,主要用于监控单个App的CPU、内存、流量、启动耗时、电量、电流等性能状态的变化,且 用户可自定义配置监控的频率...

AndrewLeo
2017/03/13
1.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

基于Spring Boot2.0.2版本--SpringBoot整合Quartz调度框架

一、引言 定时任务调度是Java开发中不可或缺的重要部分,但是Java自带的Time等任务调度类在实际项目中不好用。所以Quartz和Spring Task就成了我们项目开发技术选型最多的,在这里我们着重探讨...

修改bug工程师
7分钟前
9
0
hbase查询速度优化

优化思路 1.构建良好的索引 2.查询时只查需要的字段 3.java使用habse原生方式链接hbase spring集成的hbase链接和查询方式 @Configurationpublic class HbaseConfig { @Bean publi...

qiaoaniu
8分钟前
7
0
Python3 +scrapy爬虫识别验证码(二)点触验证码识别

感谢作者分享-http://bjbsair.com/2020-04-07/tech-info/30742.html 点触验证码主要有点击文字或者点击图片,例如 如何通过点击图片当中的文字或者图片进行识别呢?那么这里介绍一下超级鹰平...

曹长卿
9分钟前
10
0
Jackson deserialize using generic

某度找出来的实在惨不忍睹,还是记一下吧. 用jackson 把 Json string 转换成 java object 大家都会,比较简单. 怎么转带泛型的类呢,头一遭儿. 参考链接: https://stackoverflow.com/questions...

园领T
9分钟前
7
0
学习Tomcat - 类加载器

Servlet规范定义的类加载顺序 在Servlet规范中有对web应用程序类的加载方式作出建议,重要的有两点: 容器要加载某个类时,类加载器首先应该加载本地web应用程序中“WEB-INF/classes”路径中...

閒散人員
11分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部