7

(我认为这是一个常见问题,但请不要太快将其标记为重复,因为我相信我的回答会为讨论增添新内容。)

相关的 API 是TrafficStats,它从例如 /proc/uid_stat/ 中获取数据。

统计信息必须包括 GCM 等,而不仅仅是我启动的内容,因此基于线程和标签的计数器是不够的。

第一个问题是基于UID(即每个应用程序)获取移动数据使用的API 明显缺失。有 getMobile API 和 getUid API,但没有将它们组合在一起。我提出了一个解决方案作为下面的一个答案。

更重要的是,我的印象是,TrafficStats 有太多错误,无法用于此通用目的。我也把它作为一个可能的答案,如果被接受,那么最好的解决方案是手动计算数据使用量。

4

2 回答 2

4

这是我最初的解决方案。API 实际上以多种方式被破坏,无论是旧的还是新的,所以这只是一个可以在修复它们的情况下使用的解决方案。

获取应用的统计信息很简单:

int uid = android.os.Process.myUid();
txBytesInitial = TrafficStats.getUidTxBytes(uid);
rxBytesInitial = TrafficStats.getUidRxBytes(uid);

因此,每次网络连接丢失(或应用关闭,或应用逻辑需要统计信息)时,应用数据使用量的增量都会根据 NetworkInfo.getType() 添加到统计信息中。您需要维护最后一次检索以用于增量计算,这些需要存储在 SharedPreferences 中,并在手机重新启动或方向错误时重置(取决于设备,它们可以出于其他原因重置)然后重新启动)。

请参阅这篇有用的 SO 帖子以及有关这些 API 的一些附加说明(例如,它们不包括数据包开销,仅包括有效负载)。

于 2013-10-17T19:18:08.233 回答
2

我认为最好的解决方案是使用wireshark之​​类的东西来衡量你的应用程序的各种网络操作所使用的数据,然后手动跟踪你的数据消耗。这当然是可行的。

我这么说是因为 TrafficStats 中的 bug 积累得更快,然后才被修复,补丁被忽略,所以我的印象是 TrafficStats 没有得到维护,应该避免。JBQ 在他辞职之前分配了很多,但我相信他只是在清理。我意识到 Android 设置包括数据使用统计信息。我没有调查过,但猜想这些也不可靠(对不起,我很懒,但我已经得出结论,如果我只是手动进行计算,我会浪费更少的时间)。

以下是我在查看通用 API 时遇到的一些交通统计错误(一些问题在 TrafficStats,一些源自内核)。我还没有尝试过基于线程/标签/套接字的 API,并且目前不打算根据我的经验来尝试,但我很想知道它们是否能更好地工作。

在 2.x
Android TrafficStats.getTotalRxBytes() 低于预期

在 3.x
TrafficStats.getMobileRxBytes() 和 TrafficStats.getMobileTxBytes() 中:
https
://code.google.com/p/android/issues/detail?id= 19938 TrafficStats API 不报告 UDP 流量,即使 API 级别 12 及以上他们应该得到支持(从未修复):
https ://code.google.com/p/android/issues/detail?id=32410

在 4.3 中,getUid API 完全被破坏了,但听起来他们可能正在计划修复这个错误。无论如何,如果该漏洞已泄露给 Google 的合作伙伴,那么我认为这些 API 在可预见的未来将毫无用处。

TrafficStats.getUidRxBytes 和 getUidTxBytes 在 4.3 中始终返回 0:
https
://code.google.com/p/android/issues/detail?id=58210 并查看此 SO 帖子

于 2013-10-17T19:40:50.463 回答