eBPF 网络流量工具结合使用内核与用户空间实现来监控设备自上次启动以来的网络使用情况。它提供了额外的功能(如套接字标记、分离前台/后台流量,以及按 UID 划分的防火墙),以根据手机状态阻止应用访问网络。从该工具收集的统计数据存储在称为 eBPF maps 的内核数据结构中,并且相应结果由 NetworkStatsService 等服务用来提供自设备上次启动以来的持久流量统计数据。

示例和来源

用户空间更改主要在 system/netd 和 framework/base 项目中。开发工作在 AOSP 中完成,因此 AOSP 代码将始终保持最新状态。源代码主要位于 system/netd/server/TrafficController*system/netd/bpfloader 和 system/netd/libbpf/ 中。此外,一些必要的框架变更也在 framework/base/ 和 system/core 中。

实现

从 Android 9 开始,内核版本为 4.9 或更高且最初搭载了 Android P 版本的 Android 设备必须使用基于 eBPF 的网络流量监控记帐模块,而不是 xt_qtaguid。新的基础架构更灵活且更易于维护,并且不需要任何外部内核代码。

旧版流量监控和 eBPF 流量监控之间的主要设计差异如图 1 所示。

图 1.旧版流量监控(左)和 eBPF 流量监控(右)的设计差异

新的 trafficController 设计基于 cgroup 级的 eBPF 过滤器以及内核中的 xt_bpf netfilter 模块。这些 eBPF 过滤器在收发数据包时应用,数据包需要通过这些过滤器。cgroup eBPF 过滤器位于传输层,负责根据套接字 UID 以及用户空间设置对正确的 UID 计算流量。xt_bpf netfilter 挂接在 bw_raw_PREROUTING 和 bw_mangle_POSTROUTING 链上,负责对正确的接口计算流量。

在启动时,用户空间进程 trafficController 会创建用于收集数据的 eBPF 映射,并将所有映射作为虚拟文件固定在 sys/fs/bpf。然后,特权进程 bpfloader 将预编译的 eBPF 程序加载到内核中,并将其附加到正确的 cgroup。所有流量都对应于同一个根 cgroup,因此默认情况下,所有进程都应包含在该 cgroup 中。

在运行时,trafficController 可以通过将数据写入 traffic_cookie_tag_map 和 traffic_uid_counterSet_map 来标记/取消标记套接字。NetworkStatsService 可以从 traffic_tag_stats_maptraffic_uid_stats_map 和 traffic_iface_stats_map 中读取流量统计数据。除了流量统计数据收集功能之外,trafficController 和 cgroup eBPF 过滤器还负责根据手机设置屏蔽来自某些 UID 的流量。基于 UID 的网络流量屏蔽功能取代了内核中的 xt_owner 模块,并且可以通过将数据写入 traffic_powersave_uid_maptraffic_standby_uid_map 和 traffic_dozable_uid_map 来配置详细模式。

新实现遵循旧版 xt_qtaguid 模块实现,因此 TrafficController 和 NetworkStatsService 将使用旧版实现或新实现运行。如果应用使用公共 API,那么无论在后台使用 xt_qtaguid 还是 eBPF 工具,应该没有任何区别。

如果设备内核基于 Android 通用内核 4.9(SHA39c856663dcc81739e52b02b77d6af259eb838f6 或更高版本),则无需修改 HAL、驱动程序或内核代码,即可实现新的 eBPF 工具。

要求

  1. 内核配置必须开启以下配置:

    验证是否已开启正确配置时,VTS 内核配置测试非常有用。

    1. CONFIG_CGROUP_BPF=y

    2. CONFIG_BPF=y

    3. CONFIG_BPF_SYSCALL=y

    4. CONFIG_NETFILTER_XT_MATCH_BPF=y

    5. CONFIG_INET_UDP_DIAG=y

  2. 设备 MEM_LOCK 资源限制必须设为 8 MB 或更多。

旧版 xt_qtaguid 弃用过程

新的 eBPF 工具正在逐步取代 xt_qtaguid 模块以及它所基于的 xt_owner 模块。我们将开始从 Android 内核中移除 xt_qtaguid 模块,并停用不必要的配置。

在 Android 9 版本中,xt_qtaguid 模块在所有设备上都处于开启状态,但直接读取 xt_qtaguid 模块 proc 文件的所有公共 API 都移到了 NetworkManagement 服务中。根据设备内核版本和初始 API 级别,NetworkManagement 服务能够知道 eBPF 工具是否处于开启状态,并选择正确的模块来获取每个应用的网络使用情况统计数据。sepolicy 会阻止 SDK 级别为 28 及以上的应用访问 xt_qtaguid proc 文件。

在 Android 9 之后的下一个版本中,我们将完全阻止应用访问这些 xt_qtaguid proc 文件,并开始从新的 Android 通用内核中移除 xt_qtaguid 模块。移除该模块后,我们将更新相应内核版本的 Android 基础配置,以明确关闭 xt_qtaguid 模块。当 Android 版本的最低内核版本要求为 4.9 或更高时,我们将彻底弃用 xt_qtaguid 模块。

在 Android 9 版本中,只有搭载 Android 9 版本的设备才需要具备新的 eBPF 功能。如果设备搭载的内核可以支持 eBPF 工具,我们建议在升级到 Android 9 版本时,将设备更新为采用新的 eBPF 功能。没有强制执行该更新的 CTS 测试。

验证

您应该定期从 Android 通用内核和 Android AOSP 主分支获取补丁程序。请确保您的实现通过适用的 VTS 和 CTS 测试,即 netd_unit_test 和 libbpf_test

测试

提供了内核 net_tests,用来确保您开启了必需的功能,并向后移植了必需的内核补丁程序。这些测试已集成到 Android 9 版本 VTS 测试中。system/netd/ 中有一些单元测试(netd_unit_test 和 libbpf_test)。netd_integration_test 中有一些验证新工具整体行为的测试。

CTS 和 CTS 验证程序

由于这两个流量监控模块在 Android 9 版本中都得到支持,因此没有强制在所有设备上实现新模块的 CTS 测试。不过,对于内核版本高于 4.9 且最初搭载了 Android 9 版本(即,初始 API 级别大于等于 28)的设备,提供了基于 GSI 的 CTS 测试,用于验证是否正确配置了新模块。旧的 CTS 测试(如TrafficStatsTestNetworkUsageStatsTest 和 CtsNativeNetTestCases)可用于验证新模块的行为是否与旧的 UID 模块一致。

手动测试

system/netd/中有一些单元测试(netd_unit_testnetd_integration_test 和 libbpf_test)。此外,还提供了 dumpsys 支持,以便手动检查状态。dumpsys netd 命令可显示 trafficController 模块的基本状态以及是否正确开启了 eBPF。如果 eBPF 处于开启状态,dumpsys netd trafficcontroller 命令会显示每个 eBPF 映射的详细内容,包括带标记的套接字信息、每个标记的统计数据、UID 和 iface,以及所有者 UID 匹配项。

测试所在位置

CTS 测试位于以下位置:

  • https://android.googlesource.com/platform/cts/+/master/tests/tests/net/src/android/net/cts/TrafficStatsTest.java

  • https://android.googlesource.com/platform/cts/+/master/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java

  • https://android.googlesource.com/platform/system/netd/+/master/tests/bpf_base_test.cpp

VTS 测试位于 https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py。

单元测试位于以下位置:

  • https://android.googlesource.com/platform/system/netd/+/master/libbpf/BpfNetworkStatsTest.cpp

  • https://android.googlesource.com/platform/system/netd/+/master/server/TrafficControllerTest.cpp

Android中的 eBPF 流量监控相关推荐

  1. Android中如何屏蔽IP地址

    前言 前几篇介绍了iptables | 路由策略 | DNS等相关理论基础知识,现在在这基础上,去学习安卓的网络框架并应用这些知识点.Android的网络框架可以细分很多部分,按功能分的话,可以分网络 ...

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

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

  3. WiFi网络带宽、流量监控管理

    当您的组织拥有越来越多的有线和无线设备时,有必要在预算.性能和安全性之间取得准确的平衡.尽管无线设备可以为用户提供灵活性,但鉴于其动态性质,发现和管理这些设备可能极具挑战性. 为用户提供功能性无线网络 ...

  4. android流量显示插件,[android]仿360状态,种流量监控桌面浮动显示

    [android]仿360状态,类流量监控桌面浮动显示 前两天看到部分音频播放器可以实现在桌面上显示歌词,360那个浮动的桌面提示,想不到怎么实现.然后查了些资料大致了解了下,比想象的简单多了.先看效 ...

  5. Android 中流量、电量、弱网环境怎么测?

    在使用安卓机时,可能又是会经常感受到以下问题: 1.应用后台开着,手机很快没有电了---应用耗电大: 2.首次/非首次启动应用,进入应用特别慢---应用启动慢: 3.使用使用过程中,越来越卡---CP ...

  6. 360 android系统 流量,360手机卫士Android版增流量监控

    2011-3-15 10:52 [天极网IT新闻频道]目前,随着Android手机系统大热,低价智能手机越来越普及,而智能机最大的特点就是软件丰富和可随时随地可以上网.地铁里发微博,看新闻甚至看视频都 ...

  7. 360 android系统 流量,警惕天价流量费 360手机卫士Android版增流量监控

    目前,随着Android手机系统大热,低价智能手机越来越普及,而智能机最大的特点就是软件丰富和可随时随地可以上网.地铁里发微博,看新闻甚至看视频都成为很多朋友的一大爱好.但是,也有不少初次使用智能手机 ...

  8. 乐视android用流量监控,应用锁/双卡流量管理 EUI 5.8让安全更进一步

    第二代乐视超级手机全系列标配指纹识别功能,乐Max2更是采用了市面上最为先进的超声波指纹识别,不仅可以无视手指油渍和水渍轻松解锁,还能进一步提升识别准确率保证用户手机安全.硬件之外,乐视超级手机在UI ...

  9. Android流量监控论文,Android平台流量监控软件的设计与实现

    摘要: Android手机和3G网络的迅速普及,让越来越多的手机用户有条件使用Android系统的手机上网.在这样的现状下,流量超额使用的情况和软件恶意联网的情况给用户带来了经济上与精神上的损失.为解 ...

最新文章

  1. Python中常用的数据分析工具(模块)有哪些?
  2. codevs 1002 搭桥
  3. hdu 5591 ZYB's Game 博弈论
  4. CentOS系统设置自动登录
  5. mysql php gpl_MySQL_MySQL数据库远程访问权限如何打开(两种方法),下载GPL版本安装MySQL Community - phpStudy...
  6. sklearn朴素贝叶斯分类器_机器学习06——朴素贝叶斯
  7. OpenCASCADE:物理STEP文件
  8. Android之Windows下搭建React Native Android开发环境(差不多搞了一天)
  9. php点击链接代码,php 获取超链接中文本的代码
  10. 初步接触TinyXML2
  11. UVA10325 The Lottery【GCD+LCM】
  12. Mac彻底卸载搜狗输入法
  13. 董承非: 如何从各种类型的错误中学习
  14. doc和docx、xls和xlsx、ppt和pptx有什么区别?
  15. 虚拟机14.00和CentOS7安装全部过程(百度网盘安装包)
  16. ps 蒙版抠图更换背景色或背景图片
  17. JS求最小公倍数(高效算法1-短除法)
  18. 超宽带uwb精准定位,厘米级室内定位技术,实时高精度方案应用
  19. JB的产品之旅-产品经理是干嘛的?
  20. 倾斜补偿的电子罗盘(2):磁传感器的误差来源、硬磁干扰的校准(3个参数)、实验验证

热门文章

  1. 融云超级群的「同城社交平台」应用实践
  2. 怎么调用android 自带的图片浏览器
  3. 精确店铺人群标签,着重分析自然流量
  4. bind添加SRV记录说明
  5. 【WebLogic】Windows系统下WebLogic 12.1.3.0的安装和补丁
  6. Eassy-Jun.25
  7. unp第一章的测试代码
  8. 重新定义公司:谷歌是如何运营的
  9. 全桥DCDC输出电压和变比占空比的关系
  10. 随记之 -- diy相册