Android 10开始,抛弃xt_qtaguid,采用ebpf记录网络流量数据,所以无法通过/proc/net/xt_qtaguid/stats文件获取进程流量数据了。目前发现通过adb有4种方式获取进程流量数据:
- 读取/proc/uid_stat/$uid/tcp_rcv和/proc/uid_stat/$uid/tcp_snd:兼容性差,很多手机没有这两个文件;
- 读取/proc/{pid}/net/dev/:{pid}会迷惑人,以为是进程相关的流量数据,但经过测试发现该文件记录的是网卡的流量数据,无法得到进程的流量数据(如下图所示);
- 读取/proc/net/xt_qtaguid/stats: 该方式可以获取进程流量数据,但是只能在Android 9.0及以下的系统中使用
- 读取/sys/fs/bpf/traffic_uid_stats_map: 该方式应该可以在Android 10及以上的系统中获取进程流量数据,但是需要root权限
而PerfDog工具却可以监控未root的Android 10系统手机的App进程流量,经过测试发现,PerfDog启动后手机上会产生“PerfDogServer”和“PerfDogServerExt”两个进程,因此猜测它应该是通过手机端的后台程序调用系统接口(如TrafficStats和NetworkStatsManager 接口)获取相关数据(如下图所示),或者是否还有其它方式,希望大佬指教一下。