android TrafficStats getUidRxBytes 不准确

2023-12-13

我编写了一个小 Android 应用程序,发送 Http 请求,接收来自服务器的响应,并计算传输和接收的字节数。 代码如下

long receivedBytes = TrafficStats.getUidRxBytes(uid)-lastNumer

我发现收到的字节总是大于 http Header+http Body 的大小,例如 我在服务器中捕获的实际http帧大小(使用wireshark)是1645字节(标头+正文),但android API返回receivedBytes是1912,传输也是如此。

TrafficStats getUidRxBytes 本身不准确(可能这个问题特定于我的平台 samsung i9300 with cynogenmod 10.3)

最后,我找到了计算数据使用量的正确方法,我找到了其他方法来计算数据使用量,这似乎比 TrafficStats API 更准确。(非常感谢here)

private long[] getStat() {
    String line, line2;
    long[] stats = new long[2];
    try {
        File fileSnd = new File("/proc/uid_stat/"+uid+"/tcp_snd");
        File fileRcv = new File ("/proc/uid_stat/"+uid+"/tcp_rcv");
        BufferedReader br1 = new BufferedReader(new FileReader(fileSnd));
        BufferedReader br2 = new BufferedReader(new FileReader(fileRcv));
        while ((line = br1.readLine()) != null&& (line2 = br2.readLine()) != null) {
            stats[0] = Long.parseLong(line);
            stats[1] = Long.parseLong(line2);
        }
        br1.close();
        br2.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return stats;
}

我看到您已经找到了解决方案,但我会添加我对您的问题的想法,因为它可能对其他人有用(在谷歌搜索如何使用 TrafficStats API 后我自己就到了这里)。

The API文档状态:

统计数据是在网络层测量的,因此它们包括 TCP 和 UDP 使用情况。

该文档确实可以更详尽,但我倾向于说人们可以假设返回的字节数还包括组成传输层标头和网络层标头的字节.

HTTP是应用层协议。当您计算预期字节为 HTTP 标头字节加上 HTTP 正文字节时,您仅处理应用程序层字节,因此不考虑传输层和网络层标头字节。我假设 TCP 用于下载。这会添加一个 20 到 60 字节的标头。此外,假设您使用 IPv4 进行下载。这还添加了一个 20 到 60 字节的标头.

显然,这并不能解释整个 1912 - 1645 = 267 字节,但它可能会给你/其他人一些线索。


有点偏离主题,但仍然相关。目前尚不清楚 TrafficStats API 是否确实计算标头字节数。根据这个答案,API 确实not计算标头字节数。然而,鉴于上面列出的 API 文档,链接的答案可能规定了一些不正确的内容(至少对于 API 级别 21 而言)。而且,这个问题还暗示 TrafficStats 实际上计算网络和传输层标头字节(检查注释)。


TrafficStats 实际上计算网络和传输层标头字节数。看内核源代码 and 交通统计测试.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android TrafficStats getUidRxBytes 不准确 的相关文章

随机推荐

  • 使用分组依据选择前 1 个

    我有两列 namecode name 050125 chris 050125 tof 050125 tof 050130 chris 050131 tof 我想按名称代码分组 并仅返回出现次数最多的名称 在这种情况下 结果将是 050125
  • matplotlib 不支持生成器作为输入

    我正在这个网站上运行笔记本https github com vsmolyakov experiments with python blob master chp01 ensemble methods ipynb用python练习ensemb
  • 将字符串参数从 xhtml 传递给函数或方法

    我有一个按钮 我想根据函数返回 true 还是 false 来呈现它 HTML
  • 在 Windows 和 Mac 上通过 VBA 宏发送带有工作簿的电子邮件

    我的以下代码在 PC 上运行正常 但在 Mac 上不起作用 我希望脚本能够识别当前操作系统并为该操作系统运行适当的命令集 而不是为 Windows 和 Mac 用户制作两个带有单独按钮的宏版本 该宏创建一封带有工作簿附件的电子邮件 该附件是
  • 如何让Linux JVM 64位上出现OutOfMemoryError

    在我的单元测试中 我故意尝试引发 OutOfMemoryError 异常 我使用如下简单的语句 byte block new byte 128 1024 1024 1024 该代码适用于 Win7 64 位和 jdk6u21 64 位 但是
  • 带有加密密码的 Sqlite 连接字符串

    我有一个加密数据库 使用 SQLite 密码 当我尝试使用连接字符串连接到数据库时 出现以下错误消息 SQL 逻辑错误无法使用 密码 连接字符串属性 库未构建加密支持 Imports System Data SQLite Public Cl
  • 如何使用 CEFSharp 访问元素?

    我是第一次使用 CEFSharp C 我很难弄清楚如何让浏览器执行除 browser Load 之外的任何操作 我已经在许多网站上搜索了几个小时 但似乎没有人有答案或有这个问题 我正在尝试访问网站元素 就好像它们是 C 表单控件一样 简而言
  • 更换括号时出现异常

    嘿 我想用下划线替换随机字母 仅第一个 为此 我使用以下行 String newSubstring substring replaceFirst randomLetter 除非有括号 或 否则效果很好 然后我得到以下异常 06 14 15
  • 从 Windows 服务访问 Google Drive

    我试图了解是否可以从传统的 Windows 服务访问 Google Drive 而无需用户参与 遵循以下指南https developers google com drive quickstart 我已经能够创建一个命令行应用程序 将文件上
  • 显式等待在基于 Angular 的 PayPal 沙箱上不起作用

    我对 Selenium Python 的 PayPal 沙箱自动化有疑问 一般来说 我为每个操作方法编写显式等待 例如send keys or click 进入按钮 但它们就是不起作用 我尝试了几乎所有可用的显式等待 我尝试调整方法 该方法
  • UI 设计 - 是否包含取消按钮?

    我们正在为新的业务线应用程序设计 UI 我们没有真正的限制 可以自由地设计我们认为合适的 UI UI 将在 WPF 中完成 面向 Windows 7 Vista 和 XP Pro 用户 许多对话框的右下角都包含 确定 和 取消 按钮 您觉得
  • 将 Google 地图应用程序移植到 Osmdroid - 覆盖问题

    我正在将一个基于 Google 地图的项目移植到 Osmdroid 以便使用 OpenStreetMaps 除了添加由许多直线和一些文本组成的覆盖层之外 该端口工作正常 在这两个项目中 我通过计时器线程和调用 redrawOverlay 的
  • 在 Raspberry pi 上打开连接 SQLite 时出错

    更新 我只是检查了我使用的最新 JDBC jar 它缺少映射 Linux arm libsqlitejdbc so 通过从某处下载此文件可以解决此问题吗 到处都找不到 编辑 问题似乎是这样的 但我不知道如何解决这个问题 Caused by
  • Google OAuth2:何时以及如何使用刷新令牌

    我安装了一个 C 应用程序 其代码可以获取授权代码并将其交换为访问令牌 我正在存储刷新令牌 我知道在某些时候我需要使用它来获取新的访问令牌 假设我定期调用以下方法来监视与我的云端硬盘帐户共享的文件
  • 使用 v1 API 中的 cURL 将 Push FCM 发送到多个设备

    我需要将 FCM 推送通知发送到多个设备 我不能为此使用 主题 因为我需要将其发送到特定的和多个令牌 在旧方法中 我使用 register ids 来实现此目的 但 Google 在 2023 年 6 月 20 日宣布 旧方法将于 2024
  • 两个日期和两个时间之间的mySQL查询

    我想查询 mySQL 表以提取两个日期和两次时间之间的数据 我知道如何使用 Between 调用对单个 日期时间 列执行此操作 但我的列是一个 日期 列和一个 时间 列 我可以在网上找到的所有解决方案都是针对单个日期时间列的 我的范围从 第
  • 如何使用 matplotlib fill_ Between 作为默认 ylim

    无填充 带填充 plt fill between n data 我想填写默认的 y 限制 另外我可以做渐变填充吗 您可以使用ax get ylim 得到 y 极限 ax fill between n ymin data 填充最小值和曲线之间
  • iOS 工作线程

    我想在 iPhone 上创建一个后台线程 每 10 毫秒执行一些代码 但在我迷失在苹果的并发编程指南和线程编程指南之前again 我想问这里是否有人可以帮助我 我想做的事 创建后台工作线程 每 10 毫秒触发一次方法的执行 可能通过在该线程
  • 为什么可以通过构造函数分配只读属性?

    我已经设置了属性Name是只读的 但仍然可以分配 class Person public string Name get public Person string name Name name 尝试为属性设置值Name var p new
  • android TrafficStats getUidRxBytes 不准确

    我编写了一个小 Android 应用程序 发送 Http 请求 接收来自服务器的响应 并计算传输和接收的字节数 代码如下 long receivedBytes TrafficStats getUidRxBytes uid lastNumer