Android中的 eBPF 流量监控( 二 )

NetworkManagement服务能够知道 eBPF 工具是否处于开启状态,并选择正确的模块来获取每个应用的网络使用情况统计数据 。sepolicy 会阻止 SDK 级别为 28 及以上的应用访问xt_qtaguidproc 文件 。
在 Android 9 之后的下一个版本中,我们将完全阻止应用访问这些 xt_qtaguidproc 文件,并开始从新的 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_testlibbpf_test
 
测试提供了内核 net_tests,用来确保您开启了必需的功能,并向后移植了必需的内核补丁程序 。这些测试已集成到 Android 9 版本 VTS 测试中 。system/netd/中有一些单元测试(netd_unit_testlibbpf_test) 。netd_integration_test中有一些验证新工具整体行为的测试 。
 
CTS 和 CTS 验证程序由于这两个流量监控模块在 Android 9 版本中都得到支持,因此没有强制在所有设备上实现新模块的 CTS 测试 。不过,对于内核版本高于 4.9 且最初搭载了 Android 9 版本(即,初始 API 级别大于等于 28)的设备,提供了基于 GSI 的 CTS 测试,用于验证是否正确配置了新模块 。旧的 CTS 测试(如TrafficStatsTestNetworkUsageStatsTestCtsNativeNetTestCases)可用于验证新模块的行为是否与旧的 UID 模块一致 。
 
手动测试system/netd/中有一些单元测试(netd_unit_testnetd_integration_testlibbpf_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




推荐阅读