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. …...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
