Android 流量统计
Android 流量统计
最近项目上有一个应用流量统计的功能需要实现,在此总结一下
流量统计架构

在Android9.0之前,流量监控是基于xt_qtaguid模块的,通过读取/proc/net/xt_qtaguid/stats文件内容进行解析获取对应流量数据。
Android9.0之后,改为基于eBPF的网络监控模块,更加灵活且更易于维护;Android9.0 通过读取/sys/fs/bpf/traffic_uid_stats_map获取数据;Android10.0通过读取/sys/fs/bpf/map_netd_app_uid_stats_map获取数据。
调试查看流量信息:
XXX:/ # dumpsys netd trafficcontrollerTrafficControllerBPF module status: BPF_LEVEL_EXTENDEDmCookieTagMap status: OKmUidCounterSetMap status: OKmAppUidStatsMap status: OKmStatsMapA status: OKmStatsMapB status: OKmIfaceIndexNameMap status: OKmIfaceStatsMap status: OKmConfigurationMap status: OKmUidOwnerMap status: OKCgroup ingress program status: OKCgroup egress program status: OKxt_bpf ingress program status: OKxt_bpf egress program status: OKxt_bpf bandwidth whitelist program status: OKxt_bpf bandwidth blacklist program status: OKBPF map content:mCookieTagMap:mUidCounterSetMap:1001 11073 11002 110046 11000 110016 11076 110037 110056 110019 1mAppUidStatsMap::uid rxBytes rxPackets txBytes txPackets10020 11763 24 15904 371076 324919 1159 208570 132610036 171008 1213 143638 12391051 19271 140 9751 1540 3106517 27677 3158691 2811810019 18591 30 5631 391020 356303 1419 118037 45410045 19345 121 14092 16710037 16511616 13422 13875657 129211000 3623643 35705 3038615 35624mStatsMapA:ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes rxPackets txBytes txPacketsmStatsMapB:ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes rxPackets txBytes txPackets3 dummy0 0x0 0 0 0 0 152 21 lo 0x0 1000 1 8232 98 8232 983 dummy0 0x0 1020 0 1527 6 1527 61 lo 0x0 1020 0 1176 6 1176 6mIfaceIndexNameMap:ifaceIndex=8 ifaceName=rmnet_ipa0ifaceIndex=6 ifaceName=sit0ifaceIndex=7 ifaceName=ip6tnl0ifaceIndex=4 ifaceName=ip_vti0ifaceIndex=2 ifaceName=bond0ifaceIndex=11 ifaceName=p2p0ifaceIndex=3 ifaceName=dummy0ifaceIndex=10 ifaceName=wlan0ifaceIndex=5 ifaceName=ip6_vti0ifaceIndex=1 ifaceName=lomIfaceStatsMap::ifaceIndex ifaceName rxBytes rxPackets txBytes txPackets3 dummy0 50949 196 110002 50110 wlan0 4210802 7222 764069 66531 lo 19812096 73362 19812096 73362
查询方法
这里主要介绍一下NetworkStatsManager的相关方法
TrafficStats
- 获取所有网口总的统计数据
- static long getTotalRxBytes() //返回设备启动后收到的字节数。
- static long getTotalRxPackets() //返回设备启动后收到的数据包数量。
- static long getTotalTxBytes() //返回设备启动后传输的字节数。
- static long getTotalTxPackets() //返回设备启动后传输的数据包数量。
- 根据UID获取统计数据
- static long getUidRxBytes(int uid) //返回设备引导后给定UID收到的字节数。
- static long getUidRxPackets(int uid) //返回设备启动后给定UID收到的数据包数量。
- static long getUidTxBytes(int uid) //返回设备启动后收到的字节数。
- static long getUidTxPackets(int uid) //返回设备启动后传输的数据包数量
NetworkStatsManager
通过UID查询单个应用
- 通过包名获取UID
private static int getUidByPackageName(Context context, String packageName) {int uid = -1;PackageManager packageManager = context.getPackageManager();try {PackageInfo packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_META_DATA);uid = packageInfo.applicationInfo.uid;} catch (PackageManager.NameNotFoundException ex) {ex.printStackTrace();}return uid;}
- 获取应用使用流量信息
- 参数描述如下:
networkType查询网络类型 (ConnectivityManager.TYPE_WIFI,ConnectivityManager.TYPE_MOBILE)subscriberId设备唯一id(android 10及以后设备 获取不了,可不传)startTime查询指定时间段 开始时间戳endTime查询指定时间段 结束时间uid查询设备的Uid
- 参数描述如下:
NetworkStatsManager statsManager = (NetworkStatsManager) AccountApplication.getContext().getSystemService(NETWORK_STATS_SERVICE);try (NetworkStats stats = statsManager.queryDetailsForUid(ConnectivityManager.TYPE_MOBILE,null, startTime, endTime, uid)) {NetworkStats.Bucket bucket = new NetworkStats.Bucket();stats.getNextBucket(bucket);totalSize = bucket.getRxBytes() + bucket.getTxBytes();}
问题
在使用queryDetailsForUid方法的过程中,发现获取到的数据为0,通过网上查阅才了解到,需要设置subscribeId为null而不是“”,源码中也有相关说明
- queryDetailsForUid(int networkType, String subscriberId,long startTime, long endTime, int uid)

- queryDetailsForUidTagState(int networkType, String subscriberId,long startTime, long endTime, int uid, int tag, int state)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sbCtthh2-1677057537429)(C:\Users\ts\AppData\Roaming\Typora\typora-user-images\image-20230222171356158.png)]
- createTemplate(int networkType, String subscriberId)

这里可以看到传入null进行查询就可以了;
然后是查询APP今日使用流量,发现总是获取为0,后来通过查询时间改为次日即可正常查询出来,very good!
参考连接
- (2条消息) android 统计应用流量 NetworkStatsManager_android获取流量使用情况_北极的松树的博客-CSDN博客
- Android-流量统计 - Wxy的个人博客 (leo-wxy.github.io)
- NetworkStatsManager.java - OpenGrok cross reference for /frameworks/base/core/java/android/app/usage/NetworkStatsManager.java (aospxref.com)
相关文章:
Android 流量统计
Android 流量统计最近项目上有一个应用流量统计的功能需要实现,在此总结一下 流量统计架构 在Android9.0之前,流量监控是基于xt_qtaguid模块的,通过读取/proc/net/xt_qtaguid/stats文件内容进行解析获取对应流量数据。 Android9.0之后&…...
如何保证数据的安全?对称和非对称加密,身份认证,摘要算法,数字证书等傻傻分不清?波哥图解带你彻底掌握
支付安全 1.基础概念 明文:加密前的消息叫“明文”(plain text) 密文:加密后的文本叫“密文”(cipher text) 密钥:只有掌握特殊“钥匙”的人,才能对加密的文本进行解密,…...
计算机网络概述
目录前言计算机网络的形成<font colorblue>计算机定义与分类计算机网络的定义计算机网络的分类1.按网络的覆盖范围分类2.按网络采用的传输技术分类按网络的拓扑分类计算机网络的组成计算机网络体系结构层次结构体系ISO/OSI 参考模型Tcp/ip体系结构这就是计算机网络的基础…...
小学生学Arduino---------点阵(二)动态图片以及文字
今天进阶了利用人眼视觉暂留原理制作动态的图片变换。 1、熟练掌握图片显示器的使用 2、创作多种动态图片、文字的显示 3、明确动态图片、文字显示过程 4、掌握图片显示器中清空指令的使用 5、搭建动态图片、文字的显示电路 6、编写动态图片、文字的程序 复习: 绘…...
【C语言】-程序编译的环境和预处理详解-让你轻松理解程序是怎么运行的!!
作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 程序的编译前言一、 程序的翻译环境和执行环境二、 详解翻译环境2.1编译环境2.1.1预编…...
MapBox动态气泡图渲染教程
先来看效果: 视频效果: 屏幕录制2023-02-22 15.34.57 首先我们来介绍一下思路。对于mapbox和openlayers这样的框架来讲,气泡图中的气泡本质上就是一个div,就是将一个dom元素追加到canvas上的固定位置而已。 在mapbox中有marker的概念,官网也有示例: Attach a popup to …...
在 Ubuntu18.04 上编译安装 GMP
(2021.08.04)最近为了安装 IBM 的开源项目 HElib C,需要在服务器上先安装GMP和NTL,NTL需要依赖GMP,所以先来安装一下GMP,记录一下在服务器上安装成功的过程:) 直接安装libgmp二进制文…...
到底什么样的条件才能被浙大MBA录取?攻略集合
新一年管理类联考已悄然启动,很多考生把目标也都放在了浙江大学MBA项目上,那么浙江大学MBA项目好考吗?报考流程是怎样的?杭州达立易考教育在这里给大家汇总整理了浙大MBA项目相关资讯,分享给想要报考浙大MBA的同学&…...
Impacket工具使用
Impacket工具说明 Impacker是用户处理网络协议的Python类集合,用于对SAB1-3或IPv4/IPv6 上的TCP/UPD/ICMP/IGMP/ARP/IPv4/IPv6/SMB/MSRPC/NTLM/Kerberos/WMI/LDAP 等进行低级的编程访问,数据包可以从头开始构建,也可以从原始数据包中解析, 面向对象API使用处理协议的深层结构变…...
华为OD机试真题Python实现【RSA 加密算法】真题+解题思路+代码(20222023)
RSA 加密算法 题目 RSA 加密算法在网络安全世界中无处不在 它利用了极大整数因数分解的困难度,数据越大安全系数越高 给定了一个32位正整数,请对其进行因数分解 找出哪两个素数的乘积 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输…...
App.vue中读取不到路由的信息
问题: 首先定义了一个路由,并且在路由元里面存储了一个变量,在App.vue里面访问这个变量的时候却显示undefined!在路由对应的组件中却能访问到! 定义的路由元信息: 为啥访问不到…,懵逼的我在App.vue里…...
Lambda表达式详解
文章目录1、Lambda表达式简介2、如何使用Lambda表达式3、在哪里使用Lambda表达式3.1 函数式接口3.2函数描述符4、四大核心函数式接口4.1 Predicate4.2 Consumer4.3 Function4.4 Supplier5、方法引用5.1 方法引用的使用情况6、构造器引用7、数组引用8、复合Lambda表达式的有用方…...
网关的通用设计框架
概念 网关,很多地方将网关比如成门, 没什么问题, 但是需要区分网关与网桥的区别。 网桥:工作在数据链路层,在不同或相同类型的LAN之间存储并转发数据帧,必要时进行链路层上的协议转换。可连接两个或多个网络…...
API 接口应该如何设计?如何保证安全?如何签名?如何防重?
说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢&am…...
LeetCode-131. 分割回文串
目录题目思路回溯题目来源 131. 分割回文串 题目思路 切割问题类似组合问题。 例如对于字符串abcdef: 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个…。切割问题:切割一个a之后&…...
【C++】string类的基本使用
层楼终究误少年,自由早晚乱余生。你我山前没相见,山后别相逢… 文章目录一、编码(ascll、unicode字符集、常用的utf-8编码规则、GBK)1.详谈各种编码规则2.汉字在不同的编码规则中所占字节数二、string类的基本使用1.string类的本质…...
【第一章 - 绪论】- 数据结构(近八千字详解)
目录 一、 数据结构的研究内容 二、基本概念和术语 2.1 - 数据、数据元素、数据项和数据对象 2.2 - 数据结构 2.2.1 - 逻辑结构 2.2.2 - 存储结构 2.3 - 数据类型和抽象数据类型 三、抽象数据类型的表现与实现 四、算法和算法分析 4.1 - 算法的定义及特性 4.2 - 评价…...
QIfw制作软件安装程序
前言 Qt Installer Framework是Qt默认包的发布框架。它很方便,使用静态编译Qt制作而成。从Qt的下载地址中下载Qt Installer Framework,地址是:http://download.qt.io/official_releases/qt-installer-framework/ 。支持我们自定义一些我们需要的东西包括页面、交互等。 框…...
【C++】C++入门(上)
前言: C是在C语言的基础上不断添加东西形成的一门语言,在C语言的基础上引入了面向对象的思想。因此C既是面向对象的语言,也是面向过程的语言。因为C是以C语言为基础的,所以基本上C兼容所有的C语言。目前最常用的版本是C98和C11这两…...
5. Kimball维度建模常用术语及概念(一)
文章目录维度建模过程相关概念1. 收集业务需求与数据实现2. 协作维度建模研讨3. 四步骤维度设计过程4. 业务过程5. 粒度6. 描述环境的维度7. 用于度量的事实8. 维度模型事实表技术术语1. 事实表结构2. 可加、半可加、不可加事实3. 事实表中的空值4. 一致性事实5. 事务事实表6. …...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
