Tom*_*Tom 7 android usage-statistics android-data-usage
(我认为这是一个常见问题,但请不要太快,因为我相信我的答案会为讨论添加一些新内容.)
相关的API是TrafficStats,它从例如/ proc/uid_stat /获取其数据.
统计数据必须包括GCM等,而不仅仅是我发起的内容,因此基于线程和标记的计数器是不够的.
第一个问题是基于UID(即每个应用程序)获得移动数据使用的API显然不存在.有getMobile API和getUid API,但没有任何组合它们.我提出了一个解决方案,作为下面的一个答案.
更重要的是,我得到的印象是TrafficStats有太多的bug可用于这个通用目的.我把它作为一个可能的答案,如果这被接受,那么最好的解决方案是手动计算数据使用量.
这是我最初的解决方案。API 实际上以多种方式被破坏,无论是旧的还是新的,所以这只是一个解决方案,如果它们被修复,就可以使用。
获取应用程序的统计信息很简单:
int uid = android.os.Process.myUid();
txBytesInitial = TrafficStats.getUidTxBytes(uid);
rxBytesInitial = TrafficStats.getUidRxBytes(uid);
Run Code Online (Sandbox Code Playgroud)
因此,每次网络连接丢失(或应用程序关闭,或应用程序逻辑需要统计信息)时,应用程序数据使用量的增量都会根据 NetworkInfo.getType() 添加到您的统计信息中。您需要维护最后检索到的数据以用于增量计算,并且这些数据需要存储在 SharedPreferences 中,并在手机重新启动时或每当它们走错方向时重置(取决于设备,它们可以因其他原因重置)然后重新启动)。
请参阅这篇有用的 SO 帖子,其中包含有关这些 API 的一些附加说明(例如,它们不包括数据包开销,仅包括有效负载)。
我认为最好的解决方案是使用wireshark之类的工具来测量应用程序的各种网络操作使用的数据,然后手动跟踪您的数据消耗。这当然是可行的。
我这样说是因为 TrafficStats 中的错误累积速度比修复速度更快,并且补丁被忽略,所以我的印象是 TrafficStats 没有得到维护,应该避免。JBQ在辞职前分配了很多工作,但我相信他只是在清理。我意识到 Android 设置包括数据使用统计信息。我没有调查过,但猜测这些也不可靠(抱歉我很懒,但我已经得出结论,如果我只是手动进行计算,我会浪费更少的时间)。
以下是我在查看通用 API 时遇到的 Trafficstats 中的一些错误(其中一些问题在 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 已完全损坏,但听起来他们可能正在计划修复此错误。无论如何,如果这个 bug 已经传给了 Google 的合作伙伴,那么我认为这些 API 在可预见的未来是毫无用处的。
TrafficStats.getUidRxBytes 和 getUidTxBytes 在 4.3 中始终返回 0:
https://code.google.com/p/android/issues/detail?
id=58210 并查看此 SO post。
| 归档时间: |
|
| 查看次数: |
3345 次 |
| 最近记录: |