当前位置:   article > 正文

Android 流量监测的原理_安卓流量历史记录原理

安卓流量历史记录原理

1. Linux 系统下所有的信息都是以文件的形式存在的,所以应用程序的流量信息也会被保存在操作系统的文件中。Android 2.2 版本以前的系统的流量信息都存放在 proc/net/dev(或者 proc/self/net/dev)文件下,读取文件然后对其进行解析就行了。读取某一个应用的流量,则读取proc/uid_stat/uid /tcp_rcv 文件进行解析(模拟器下不存在这个目录)。如需查看某个应用的流量信息,可以通过以下命令来实现:

  1. adb shell //进入对应的设备
  2. cd proc //进入设备的属性目录
  3. cd uid_stat //进入 user id 状态目录,每个应用程序在安装的时候系统会为每个应用分配一个对应的 uid
  4. ls //列出 uid_stat 目录下所有应用对应的 user id 目录
  5. cd uid //进入对应应用的 uid 目录
  6. ls //查看对应 uid 目录下的 tcp_rcv 和 tcp_snd 目录
  7. cat tcp_rcv //查看该应用接收的数据信息
  8. cat tcp_snd //查看该应用发送的数据信息
  1. root@android:/proc/uid_stat # ls
  2. 1000
  3. 10017
  4. 10038
  5. 10041
  6. 10045
  7. 10051
  8. 10053
  9. 10080
  10. 10081
  11. 10085
  12. 10087
  13. 10088
  14. 10095
  15. 10101
  16. 10102
  17. 10104
  18. 10105
  19. 10121
  20. 10126
  21. 10127
  22. 10132
  23. 10148
  24. root@android:/proc/uid_stat #
这里需要注意的是不同语言编写的应用程序对应的的 uid 命名规则是不同的,如果是 Java 编写的应用程序,它的 uid 是从 10000 开始的,如果是 C 语言编写的,它的 uid 是从 1000 开始的。另外,uid 一旦被分配,是不会改变的。从下面我们可以看到类似 u0_a115, u0_a80, u0_a85, u0_a121 的信息,这些信息也代表了uid,也就是说 u0_a0等同于 10000,u0_a2等同于 10001,事实上“u0_a”后面的信息代表这个应用的安装序号,表示这个应用是第几个被安装到系统的。

  1. root@android:/data/data # ls -l
  2. drwxrwxr-x system system 2011-01-06 05:22 androidhwext
  3. drwxrwxr-x u0_a115 u0_a115 2015-03-23 09:02 cn.ninegame.gamemanager
  4. drwxr-x--x u0_a80 u0_a80 2015-03-23 09:02 com.ali.money.shield
  5. drwxr-x--x u0_a85 u0_a85 2015-03-26 02:35 com.alibaba.alibaba_root
  6. drwxrwxr-x u0_a121 u0_a121 2015-03-23 09:02 com.alibaba.android.security.activity
  7. drwxrwxr-x u0_a89 u0_a89 2014-06-12 06:07 com.alipay.android.app
  8. drwxrwxr-x u0_a2 u0_a2 2011-01-06 05:22 com.android.backupconfirm
  9. drwxrwxr-x bluetooth bluetooth 2015-01-06 09:29 com.android.bluetooth
  10. drwxrwxr-x u0_a4 u0_a4 2014-06-11 02:57 com.android.browser
  11. drwxrwxr-x u0_a5 u0_a5 2011-01-06 05:22 com.android.calculator2
  12. drwxrwxr-x u0_a6 u0_a6 2011-01-06 05:24 com.android.calendar
  13. drwxrwxr-x u0_a8 u0_a8 2014-06-11 02:57 com.android.certinstaller
  14. drwxrwxr-x u0_a1 u0_a1 2011-01-06 05:24 com.android.contacts

2. Android 2.2 版本中加入了 TrafficStats 类来实现对流量统计的操作,其实 TrafficStats 类自身也是依靠读取 Linux 下保存流量信息的文件并进行解析来实现的。android.net.TrafficStats 类中提供了多种静态方法,可以直接调用获取,返回类型均为 long 型,如果返回值等于 -1 代表 UNSUPPORTED,表示当前设备不支持统计,这里需要注意的是,通过 TrafficStats 获取的数据在手机重启的时候会被清空,所以,如果要对流量进行持续的统计需要将数据保存到数据库中,在手机重启时将数据读出进行累加即可。TrafficStats 类的静态方法如下:

  1. package com.test.mytest;
  2. import android.net.TrafficStats;
  3. public class MyTestClass2 {
  4. public void test() {
  5. int uid = android.os.Process.myUid();
  6. /** 获取手机通过 2G/3G 接收的字节流量总数 */
  7. TrafficStats.getMobileRxBytes();
  8. /** 获取手机通过 2G/3G 接收的数据包总数 */
  9. TrafficStats.getMobileRxPackets();
  10. /** 获取手机通过 2G/3G 发出的字节流量总数 */
  11. TrafficStats.getMobileTxBytes();
  12. /** 获取手机通过 2G/3G 发出的数据包总数 */
  13. TrafficStats.getMobileTxPackets();
  14. /** 获取手机通过所有网络方式接收的字节流量总数(包括 wifi) */
  15. TrafficStats.getTotalRxBytes();
  16. /** 获取手机通过所有网络方式接收的数据包总数(包括 wifi) */
  17. TrafficStats.getTotalRxPackets();
  18. /** 获取手机通过所有网络方式发送的字节流量总数(包括 wifi) */
  19. TrafficStats.getTotalTxBytes();
  20. /** 获取手机通过所有网络方式发送的数据包总数(包括 wifi) */
  21. TrafficStats.getTotalTxPackets();
  22. /** 获取手机指定 UID 对应的应程序用通过所有网络方式接收的字节流量总数(包括 wifi) */
  23. TrafficStats.getUidRxBytes(uid);
  24. /** 获取手机指定 UID 对应的应用程序通过所有网络方式发送的字节流量总数(包括 wifi) */
  25. TrafficStats.getUidTxBytes(uid);
  26. }
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/300902
推荐阅读
相关标签
  

闽ICP备14008679号