Android流量统计分析

本文只做为个人分析留档。

使用

NetworkStatsManager statsManager = (NetworkStatsManager) getSystemService(Context.NETWORK_STATS_SERVICE);
tatsManager.querySummary(ConnectivityManager.TYPE_MOBILE, "", startTime, endTime);
statsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, startTime, endTime);

权限分析

为什么需要权限?

NetworkStatsAccess.java
@NetworkStatsAccess.Level int checkAccessLevel

这类生成查询的等级,按顺序来。
1.如果是系统签名,后面直接放行,可以查询全部。NetworkStatsAccess.Level.DEVICE;
2.如果是isDeviceOwner ,system uid同上。NetworkStatsAccess.Level.DEVICE;
3.如果拥有上述权限,level是:NetworkStatsAccess.Level.DEVICESUMMARY;
4.如果是isProfileOwner,level是:NetworkStatsAccess.Level.USER;
5.啥都没有就是默认:NetworkStatsAccess.Level.DEFAULT;

查询之前检测level

public static boolean isAccessibleToUser(int uid, int callerUid,@NetworkStatsAccess.Level int accessLevel) {switch (accessLevel) {case NetworkStatsAccess.Level.DEVICE:// Device-level access - can access usage for any uid.return true;case NetworkStatsAccess.Level.DEVICESUMMARY:// Can access usage for any app running in the same user, along// with some special uids (system, removed, or tethering) and// anonymized uidsreturn uid == android.os.Process.SYSTEM_UID || uid == UID_REMOVED|| uid == UID_TETHERING || uid == UID_ALL|| UserHandle.getUserId(uid) == UserHandle.getUserId(callerUid);case NetworkStatsAccess.Level.USER:// User-level access - can access usage for any app running in the same user, along// with some special uids (system, removed, or tethering).return uid == android.os.Process.SYSTEM_UID || uid == UID_REMOVED|| uid == UID_TETHERING|| UserHandle.getUserId(uid) == UserHandle.getUserId(callerUid);case NetworkStatsAccess.Level.DEFAULT:default:// Default access level - can only access one's own usage.return uid == callerUid;}}

NetworkStatsAccess.Level.USER 和NetworkStatsAccess.Level.DEVICESUMMARY基本类似,就是多了一个uid == UID_ALL。
NetworkStatsAccess.Level.DEVICESUMMARY这里面根据系统不一样有点区别。如果系统不支持多用户,那么就能查询全部,跟NetworkStatsAccess.Level.DEVICE一样,否则看注释。

NetworkStatsService

这个类是核心类,所有的查询都是从这里开始。

1.构造
NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager,
wakeLock, getDefaultClock(), TelephonyManager.getDefault(),
new DefaultNetworkStatsSettings(context), new NetworkStatsObservers(),
getDefaultSystemDir(), getDefaultBaseDir());

构造里面传入的路径是/data/system/netstats.记住这个路径。

2.systemReady
这个方法有几个重要的方法:

 mDevRecorder = buildRecorder(PREFIX_DEV, mSettings.getDevConfig(), false);mXtRecorder = buildRecorder(PREFIX_XT, mSettings.getXtConfig(), false);mUidRecorder = buildRecorder(PREFIX_UID, mSettings.getUidConfig(), false);mUidTagRecorder = buildRecorder(PREFIX_UID_TAG, mSettings.getUidTagConfig(), true);
//对应上面路径下面的四个文件
bootstrapStatsLocked()//这个里面多了一个路径。

初次检查,上述路径没有数据,那么统计数据哪里来的?
bootstrapStatsLocked()搞定了。
这个部分回到Android之前的统计了。

public NetworkStatsFactory(File procRoot, boolean useBpfStats) {mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all");mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt");mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats");mUseBpfStats = useBpfStats;}

以上所有的文件解析出来,就是Android所有记录的流量使用情况。
其中/data/system/netstats 里面保存了uid ,pkg,subscriberId。似乎卸载的app的包名也记录了,这部分没有仔细去看。大概是因为文件是生成的时候app还没卸载。但是因为有部分流量是使用之前的流量统计逻辑,这部分不会记录包名,如果生成文件是已经卸载似乎就不会记录。

查询匹配

查询之前,生成:

 private static NetworkTemplate createTemplate(int networkType, String subscriberId) {final NetworkTemplate template;switch (networkType) {case ConnectivityManager.TYPE_MOBILE:template = subscriberId == null? NetworkTemplate.buildTemplateMobileWildcard(): NetworkTemplate.buildTemplateMobileAll(subscriberId);break;case ConnectivityManager.TYPE_WIFI:template = NetworkTemplate.buildTemplateWifiWildcard();break;default:throw new IllegalArgumentException("Cannot create template for network type "+ networkType + ", subscriberId '"+ NetworkIdentity.scrubSubscriberId(subscriberId) + "'.");}return template;}

生成的template与上述NetworkStatsService读取的数据做匹配。
具体规则区间,可以去看NetworkStatsCollection。

说明一个,移动网络查询之前subscriberId,在Android9还是10以后,传入null,就是查询时间段类的所有卡信息,即使卡不存在。即生成的template是NetworkTemplate(MATCH_MOBILE_WILDCARD, null, null);

然后正常查询,系统会去掉uid_tag文件的信息。这个部分暂时没细看是做什么的。后续有时间补充。

Android流量统计分析相关推荐

  1. 实时直播流量统计分析及可视化系统————老子明天不加班系列

    实时直播流量统计分析及可视化系统 系统介绍 本系统主要使用了Flume.kafka.Spark.Mysql数据库.python的Django框架以及echarrts来实现整个功能 本系统按照实现功能不 ...

  2. Android流量统计TrafficStats类

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

  3. android流量监控步骤_Android流量网络监控设计(超级实用版).doc

    Android流量网络监控设计(超级实用版).doc 摘 要 伴随着Android智能移动设备的普及,其对网络系统和流量监控的要求越来越高,因而,让用户有能力实现对移动设备网络流量的实时监控和显示,同 ...

  4. android 双卡流量统计,android流量统计

    android流量统计 (2012-07-31 12:28:34) 标签: 杂谈 研究过一段时间的android流量统计 发个自己的总结帖 1 android有一个TrafficStats类可以直接获 ...

  5. Android流量统计

    项目中需要对Android设备进行流量统计来进行资费结算,所以对Android设备流量统计进行了一些调研.发现流量统计主流上有两种方式 使用系统统计类TrafficStats获取 通过系统文件解析读取 ...

  6. Android 流量球效果的WaveView

    Android 流量球效果的WaveView 先看效果图: 实现上面效果的思路是使用正弦或者余弦曲线,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  7. Rainbow的站点流量统计分析

    Rainbow的站点流量统计分析 1. WhosLoggedOn模块和Monitoring模块实现对站点的统计分析.    站点统计分析的实现方法为:在用户请求页面的时候,在后台数据库保存当前的访问信 ...

  8. android wifi流量监控,Android流量监测的实现原理

    Android 2.2版本以前的,系统的流量信息都存放在proc/net/dev(或者proc/self/net/dev)文件下,读取文件然后对其进行解析就行了. 读取某一个应用的流量,则读取proc ...

  9. Android 流量分析API

    Android流量统计与分析 最近碰上一个项目需要对Android系统中的某些应用进行流量监控.一开始选择了使用91手机市场上的应用,例如networklog和NetMeter.老实说这两个应用做得都 ...

  10. android流量监控软件设计与实现,基于android平台的流量监控系统的设计与实现

    摘要: 为了解决流量超额使用,恶意流量吸费的非法插件以及软件恶意联网的问题,帮助用户安全放心使用手机,本文设计并实现了一款基于Android平台的流量监控系统. 本文以Android系统为平台,分别从 ...

最新文章

  1. antiSMASH数据库:微生物次生代谢物合成基因组簇查询和预测
  2. placeholder 颜色更改
  3. 一、【绪论】数据结构的基本概念
  4. BeetleX.WebFamily之ElasticSearch搜索集成
  5. 使用DB2的with as 语句 实现树的递归查询
  6. 通讯簿电话号码同步相关问题
  7. java entrypoint_java – 有时只调用AuthenticationEntryPoint
  8. POJ 3308 最少点集覆盖
  9. 【转】Apache+php+mysql在windows下的安装与配置图解(最新版)
  10. mac如何把node和npm卸载干净
  11. spring cloud SnakeYAML RCE
  12. 基于CIM的新型智慧城市发展政策解析
  13. 【网络通信 -- 直播】网络通信协议简介 -- RTP 协议的 H264 封包
  14. 学习大数据最正确的步骤(0基础必备)
  15. Win10多用户远程桌面
  16. Linux基础到进阶(一)Linux基础命令、输入输出错误重定向、目录分类与作用、vi编辑器
  17. WiFi无线网络参数 802.11a/b/g/n 详解
  18. 五月总结 时光待我不薄
  19. windows文件隐藏之谜
  20. (转载)Bro NIDS的规则

热门文章

  1. 《勿忘初心,勿忘前行》——2016年度总结
  2. 【麦课】1~OEL的下载
  3. 解决Windows10家庭版系统无法安装Docker Desktop问题
  4. 诗词温习集:跟梁瀚文一起重温诗词(宋词)之《雨霖铃.寒蝉凄切》宋.柳永
  5. 田忌赛马java代码算法,AcWing 1489. 田忌赛马——Java版代码
  6. 2017一季度人才大数据报告IT人才需求遥遥领先
  7. “采菊东篱下,悠然见南山”----南山路上品太古 总结
  8. 枫叶永恒 服务器维护,3月8日服务器维护公告
  9. github 下载慢下载失败?不存在的!!!
  10. 利用计算机建立动画中的 画面 由,计算机图形术在三维动画中的应用.doc