Nab*_*aba 10 networking android usage-statistics android-data-usage
对以下两种Android TrafficStats方法感到困惑: getUidTxBytes(int uid)和getUidRxBytes(int uid),这两种方法返回通过网络为此UID发送和接收的字节数.但它的时间单位是多少,是每秒?如果我想计算每个应用每天传输和接收的数据,我该怎么办.我想过一种方法,在sql中存储数据并继续向表中添加数据.这是正确的方法吗?
这些是计数器"因为接口上升"或"因为具有此UID的应用程序已启动".所以说如果你的手机进入"飞行模式"然后再回来,计数器可能会再次从零开始.如果需要每秒的值,则需要每秒调用这些函数,然后使用上次调用的增量.如果delta是负数,只需按原样使用该值,这意味着计数器再次从零开始.
还有一件事:据我所知,这些计数器只计算TCP/IP.不是UDP.因此,如果您需要非常精确的记帐,并且有问题的应用程序使用UDP/IP或TCP之外的任何其他协议,这些计数器将是错误的.
有关此功能的工作原理,请查看免费提供的Android源代码.有问题的文件是./frameworks/base/core/jni/android_net_TrafficStats.cpp
此函数从中获取数据/proc/uid_stat/[uid]/tcp_snd.如果您需要更多相关信息,您需要深入了解Linux内核......
这些计数器包含自上次重新启动以来的字节数。有些电话这些计数器可能会定期重置,但大多数情况下它们只会在重新启动后重置。进入飞行模式或在移动设备和 Wi-Fi 之间切换不会重置这些计数器。
重要的一点是这些计数器不包括数据包开销,只包括有效载荷大小。所以通常这意味着 3-4% 的数据可能下落不明。但是,如果它是数据包有效载荷较小的流媒体、torrent 或 VoIP 应用程序,则可能会有更多的数据无法计算。
有趣的是,getTotalRxBytes(跨所有接口接收的字节,前移动和 Wi-Fi 组合)和 getMobileRxBytes(仅在移动接口上接收的字节)包括所有字节,包括开销。所以基本上,您的应用程序字节数总数将少于您的界面字节数总数,因此少于您的网络运营商向您收费的数据量。
最后一点,大多数流媒体应用程序不会在他们自己的 UID 下考虑他们的数据。它们在 system.media UID 下记账。因此,如果您正在监控 YouTube 的数据使用情况,那么该应用程序下实际上只会显示极少量的数据;其余的将在媒体 UID (1013) 下。
| 归档时间: |
|
| 查看次数: |
12701 次 |
| 最近记录: |