Android流量统计分析
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流量统计分析相关推荐
- 实时直播流量统计分析及可视化系统————老子明天不加班系列
实时直播流量统计分析及可视化系统 系统介绍 本系统主要使用了Flume.kafka.Spark.Mysql数据库.python的Django框架以及echarrts来实现整个功能 本系统按照实现功能不 ...
- Android流量统计TrafficStats类
对于Android流量统计来说在2.2版中新加入了TrafficStats类可以轻松获取,其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析. android.n ...
- android流量监控步骤_Android流量网络监控设计(超级实用版).doc
Android流量网络监控设计(超级实用版).doc 摘 要 伴随着Android智能移动设备的普及,其对网络系统和流量监控的要求越来越高,因而,让用户有能力实现对移动设备网络流量的实时监控和显示,同 ...
- android 双卡流量统计,android流量统计
android流量统计 (2012-07-31 12:28:34) 标签: 杂谈 研究过一段时间的android流量统计 发个自己的总结帖 1 android有一个TrafficStats类可以直接获 ...
- Android流量统计
项目中需要对Android设备进行流量统计来进行资费结算,所以对Android设备流量统计进行了一些调研.发现流量统计主流上有两种方式 使用系统统计类TrafficStats获取 通过系统文件解析读取 ...
- Android 流量球效果的WaveView
Android 流量球效果的WaveView 先看效果图: 实现上面效果的思路是使用正弦或者余弦曲线,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...
- Rainbow的站点流量统计分析
Rainbow的站点流量统计分析 1. WhosLoggedOn模块和Monitoring模块实现对站点的统计分析. 站点统计分析的实现方法为:在用户请求页面的时候,在后台数据库保存当前的访问信 ...
- android wifi流量监控,Android流量监测的实现原理
Android 2.2版本以前的,系统的流量信息都存放在proc/net/dev(或者proc/self/net/dev)文件下,读取文件然后对其进行解析就行了. 读取某一个应用的流量,则读取proc ...
- Android 流量分析API
Android流量统计与分析 最近碰上一个项目需要对Android系统中的某些应用进行流量监控.一开始选择了使用91手机市场上的应用,例如networklog和NetMeter.老实说这两个应用做得都 ...
- android流量监控软件设计与实现,基于android平台的流量监控系统的设计与实现
摘要: 为了解决流量超额使用,恶意流量吸费的非法插件以及软件恶意联网的问题,帮助用户安全放心使用手机,本文设计并实现了一款基于Android平台的流量监控系统. 本文以Android系统为平台,分别从 ...
最新文章
- antiSMASH数据库:微生物次生代谢物合成基因组簇查询和预测
- placeholder 颜色更改
- 一、【绪论】数据结构的基本概念
- BeetleX.WebFamily之ElasticSearch搜索集成
- 使用DB2的with as 语句 实现树的递归查询
- 通讯簿电话号码同步相关问题
- java entrypoint_java – 有时只调用AuthenticationEntryPoint
- POJ 3308 最少点集覆盖
- 【转】Apache+php+mysql在windows下的安装与配置图解(最新版)
- mac如何把node和npm卸载干净
- spring cloud SnakeYAML RCE
- 基于CIM的新型智慧城市发展政策解析
- 【网络通信 -- 直播】网络通信协议简介 -- RTP 协议的 H264 封包
- 学习大数据最正确的步骤(0基础必备)
- Win10多用户远程桌面
- Linux基础到进阶(一)Linux基础命令、输入输出错误重定向、目录分类与作用、vi编辑器
- WiFi无线网络参数 802.11a/b/g/n 详解
- 五月总结 时光待我不薄
- windows文件隐藏之谜
- (转载)Bro NIDS的规则
热门文章
- 《勿忘初心,勿忘前行》——2016年度总结
- 【麦课】1~OEL的下载
- 解决Windows10家庭版系统无法安装Docker Desktop问题
- 诗词温习集:跟梁瀚文一起重温诗词(宋词)之《雨霖铃.寒蝉凄切》宋.柳永
- 田忌赛马java代码算法,AcWing 1489. 田忌赛马——Java版代码
- 2017一季度人才大数据报告IT人才需求遥遥领先
- “采菊东篱下,悠然见南山”----南山路上品太古 总结
- 枫叶永恒 服务器维护,3月8日服务器维护公告
- github 下载慢下载失败?不存在的!!!
- 利用计算机建立动画中的 画面 由,计算机图形术在三维动画中的应用.doc