如何获取我的应用程序的移动数据使用情况(例如使用TrafficStats)?

问题描述 投票:7回答:2

(我认为这是一个常见问题,但请不要太快,因为我相信我的答案会为讨论添加一些新内容。)

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

统计数据必须包括GCM等,而不仅仅是我发起的内容,因此基于线程和标记的计数器是不够的。

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

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

android usage-statistics android-data-usage
2个回答
4
投票

这是我最初的解决方案。 API实际上是以多种方式打破的,包括旧的和新的,所以这只是一个解决方案,如果它们被修复就可以使用。

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

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

因此,每次网络连接丢失(或应用程序关闭,或应用程序逻辑需要统计数据)时,应用程序数据使用中的增量将根据NetworkInfo.getType()添加到您的统计信息中。您需要维护上次检索以便在增量计算中使用,并且这些需要存储在例如:当手机重新启动或任何方向错误时,SharedPreferences并重置(取决于设备,由于其他原因可以重置,然后重启)。

请参阅this useful SO post以及有关这些API的一些其他说明(例如,它们不包括数据包开销,只包括有效负载)。


2
投票

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

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

以下是我遇到的一些流量缓存中的错误(一些问题在TraffficStats中,一些来自内核),同时查看一般API。我没有尝试过基于线程/标签/套接字的API,并且不打算根据我的经验到目前为止,但是有兴趣听听它们是否更好用。

在2.x. Android TrafficStats.getTotalRxBytes() is less than expected

在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完全被破坏了,但听起来他们可能正计划修复这个bug。无论如何,如果这个bug已经出现在谷歌的合作伙伴身上,那么我认为这些API对于可预见的未来毫无用处。

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

© www.soinside.com 2019 - 2024. All rights reserved.