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

时间:2013-10-17 19:18:08

标签: android usage-statistics android-data-usage

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

相关的API为TrafficStats,可从中获取数据。的/ proc / uid_stat /.

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

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

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

2 个答案:

答案 0 :(得分:4)

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

获取应用的统计数据非常简单:

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

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

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

答案 1 :(得分: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。无论如何,如果这个错误发生在Google的合作伙伴身上,那么我认为这些API对于可预见的未来毫无用处。

TrafficStats.getUidRxBytes和getUidTxBytes总是在4.3中返回0:
https://code.google.com/p/android/issues/detail?id=58210
请参阅this SO post