简介:本文详细介绍Android系统中获取、查看上行与下行带宽的方法,包括TrafficStats API、第三方库及网络诊断工具的使用,帮助开发者全面监控网络性能。
在移动应用开发中,网络带宽的监控与分析是优化用户体验、诊断网络问题的关键环节。无论是实时音视频传输、文件上传下载,还是API请求响应,都需要准确掌握当前网络的上行(发送)与下行(接收)带宽,以动态调整传输策略,避免卡顿或资源浪费。本文将围绕Android系统,系统阐述如何获取、查看上行与下行带宽,并提供可落地的技术方案。
Android系统提供了TrafficStats类(位于android.net包),用于统计设备网络接口的收发数据量。其核心方法是:
getUidRxBytes(int uid):获取指定UID(应用)的接收字节数(下行)。getUidTxBytes(int uid):获取指定UID(应用)的发送字节数(上行)。getTotalRxBytes():获取设备总接收字节数。getTotalTxBytes():获取设备总发送字节数。
// 获取当前应用的上下行流量(单位:字节)long uid = android.os.Process.myUid();long rxBytes = TrafficStats.getUidRxBytes(uid);long txBytes = TrafficStats.getUidTxBytes(uid);// 转换为KB或MBdouble rxKB = rxBytes / 1024.0;double txKB = txBytes / 1024.0;Log.d("Bandwidth", "下行: " + rxKB + " KB, 上行: " + txKB + " KB");
通过定时采样差值计算瞬时带宽:
private long lastRxBytes = 0;private long lastTxBytes = 0;private long lastTime = 0;public void startMonitoring() {lastRxBytes = TrafficStats.getUidRxBytes(uid);lastTxBytes = TrafficStats.getUidTxBytes(uid);lastTime = System.currentTimeMillis();// 每1秒采样一次new Handler(Looper.getMainLooper()).postDelayed(this::calculateBandwidth, 1000);}private void calculateBandwidth() {long currentRx = TrafficStats.getUidRxBytes(uid);long currentTx = TrafficStats.getUidTxBytes(uid);long currentTime = System.currentTimeMillis();long deltaRx = currentRx - lastRxBytes;long deltaTx = currentTx - lastTxBytes;long deltaTime = currentTime - lastTime;double rxSpeed = (deltaRx * 8.0) / (deltaTime / 1000.0); // 转换为bps(比特/秒)double txSpeed = (deltaTx * 8.0) / (deltaTime / 1000.0);Log.d("Bandwidth", "下行速率: " + rxSpeed/1024 + " Kbps, 上行速率: " + txSpeed/1024 + " Kbps");lastRxBytes = currentRx;lastTxBytes = currentTx;lastTime = currentTime;new Handler(Looper.getMainLooper()).postDelayed(this::calculateBandwidth, 1000);}
READ_NETWORK_USAGE_HISTORY权限(Android 10+受限)。OkHttp的EventListener可监听请求的传输进度,间接计算带宽:
OkHttpClient client = new OkHttpClient.Builder().eventListener(new EventListener() {private long startTime;private long bytesReceived = 0;@Overridepublic void callStart(Call call) {startTime = System.currentTimeMillis();}@Overridepublic void bytesReceived(Call call, long bytes) {bytesReceived += bytes;long currentTime = System.currentTimeMillis();double speed = (bytesReceived * 8.0) / ((currentTime - startTime) / 1000.0);Log.d("OkHttp", "实时下行速率: " + speed/1024 + " Kbps");}}).build();
开源库如SpeedTestLib提供完整的带宽测试功能,支持多线程下载/上传测速:
SpeedTestSocket speedTestSocket = new SpeedTestSocket();speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {@Overridepublic void onProgress(float percent, DownloadSpeedTestReport report) {Log.d("SpeedTest", "下行速率: " + report.getTransferRateBit() / 1024 + " Kbps");}});speedTestSocket.startDownload("http://example.com/largefile");
通过ADB获取设备整体带宽:
adb shell cat /proc/net/dev# 输出示例:wlan0: 12345678 98765432 ...(接收字节 发送字节)
使用Android Studio的Network Profiler,可实时查看应用的上下行流量及速率曲线。
通过ConnectivityManager.NetworkCallback监听网络切换,结合TrafficStats按接口统计:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);cm.registerNetworkCallback(new NetworkRequest.Builder().build(),new ConnectivityManager.NetworkCallback() {@Overridepublic void onAvailable(Network network) {// 获取当前网络接口的带宽}});
Root设备可通过netstat -i查看各接口的收发数据包,但非Root设备无法直接调用。
TrafficStats无需额外权限。NETWORK_STATS权限获取更详细数据。WorkManager或ForegroundService实现长期监控。Android系统提供了从应用级到系统级的多种带宽监控方案:
TrafficStats快速获取上下行流量。开发者应根据实际需求选择合适的方法,平衡精度、性能与权限限制,最终实现高效的网络带宽监控与优化。