psutil是否可用于安卓系统?安卓网络流量监测方案咨询
标准psutil库默认不支持在普通非root安卓环境下测量网络接口传输量。
psutil的网络统计功能底层依赖Linux内核暴露的/proc/net/dev等系统统计文件,安卓系统对这类文件做了严格的权限管控,普通应用进程(包括Termux中运行的Python进程、Chaquopy等内嵌Python环境的应用进程)无权限读取对应内容,强行调用psutil.net_io_counters()会抛出权限错误,或返回无效的空统计值。
根据你使用的Python运行环境不同,可选择对应方案实现需求:
Termux等本地终端Python环境(无root)
不需要安装额外第三方库,直接读取安卓开放的网卡统计节点即可获取数据。安卓会在/sys/class/net/<网卡名>/路径下暴露各网卡的实时统计文件,其中rx_bytes存累计接收字节数、tx_bytes存累计发送字节数,直接用Python文件读取接口解析即可。
参考实现代码:import time def get_iface_traffic(iface_name: str = "wlan0") -> tuple[int, int]: """读取指定网卡的累计收、发字节数,wlan0为默认WiFi网卡,移动数据网卡通常为rmnet0/rmnet_data0""" with open(f"/sys/class/net/{iface_name}/rx_bytes", "r", encoding="utf-8") as f: rx_total = int(f.read().strip()) with open(f"/sys/class/net/{iface_name}/tx_bytes", "r", encoding="utf-8") as f: tx_total = int(f.read().strip()) return rx_total, tx_total # 示例:统计1秒内的WiFi传输流量 rx_start, tx_start = get_iface_traffic("wlan0") time.sleep(1) rx_end, tx_end = get_iface_traffic("wlan0") print(f"统计区间内接收:{rx_end - rx_start} 字节,发送:{tx_end - tx_start} 字节")注意:不同厂商的移动数据网卡命名存在差异,可先执行
ls /sys/class/net查看设备上所有可用的网卡名称;上述接口返回的是设备开机后对应网卡的累计流量,统计特定区间的传输量需要两次采样做差值。已root的安卓设备
给Python运行环境授予root权限后,psutil可以正常访问系统统计文件,和普通Linux环境用法完全一致,直接调用psutil.net_io_counters(pernic=True)即可获取所有网卡的收发包、字节数等完整统计数据,不需要额外适配。安卓原生应用内嵌Python环境(如Chaquopy)
直接调用安卓原生提供的TrafficStatsAPI即可,兼容性比读取系统文件更好,支持统计设备总流量、指定UID对应应用的流量。
参考实现代码:from android.os import TrafficStats # 获取设备开机以来累计总接收、发送字节数(包含WiFi+移动数据) total_rx = TrafficStats.getTotalRxBytes() total_tx = TrafficStats.getTotalTxBytes() # 如需统计指定应用的流量,传入对应应用的UID即可 # app_uid = 10086 # 替换为目标应用的实际UID # app_rx = TrafficStats.getUidRxBytes(app_uid) # app_tx = TrafficStats.getUidTxBytes(app_uid)注意:该接口返回值同样为开机累计值,设备重启后计数清零,区间流量需通过两次采样计算差值。
内容的提问来源于stack exchange,提问作者Esra Issam

