Android 10 开始,抛弃 xt_qtaguid,采用 ebpf 记录网络流量数据,所以无法再通过/proc/net/xt_qtaguid/stats 文件获取进程流量数据了。目前发现通过 adb 有 4 种方式获取进程流量数据:

  1. 读取/proc/uid_stat/$uid/tcp_rcv 和/proc/uid_stat/$uid/tcp_snd:兼容性差,很多手机没有这两个文件;
  2. 读取/proc/$pid/net/dev:$pid 会迷惑人,以为是进程相关的流量数据,但经过测试发现该文件记录的是网卡的流量数据,无法得到进程的流量数据(如下图所示);

  3. 读取/proc/net/xt_qtaguid/stats: 该方式可以获取进程流量数据,但是只能在 Android 9.0 及以下的系统中使用

  4. 读取/sys/fs/bpf/traffic_uid_stats_map: 该方式应该可以在 Android 10 及以上的系统中获取进程流量数据,但是需要 root 权限

而 PerfDog 工具却可以监控未 root 的 Android 10 系统手机的 App 进程流量,经过测试发现,PerfDog 启动后手机上会产生 “PerfDogServer” 和 “PerfDogServerExt” 两个进程,因此猜测它应该是通过手机端的后台程序调用系统接口 (如 TrafficStats 和 NetworkStatsManager 接口) 获取相关数据(如下图所示),或者是否还有其它方式,希望大佬指教一下。


↙↙↙阅读原文可查看相关链接,并与作者交流