android流量统计的小结

android流量统计的小结

Posted on  2012.04.27  by onlinedj

最近在开发双卡过程中,发现流量统计功能无法使用。

经过调查,发现是我们kernel的问题:
1. kernel版本低(3.0.0),android版本新,导致上层发出的请求,kernel没有对 应的实现。
解决: 下载了官方的代码(3.0.28),把相应的实现替换进来就可以了。
2. 编译选项没有完全打开,只打开了qtaguid的功能
解决: 编译时需要打开qtaguid的选项,并且要打开netfilter的filter选项

修改完毕后,测试三台机器均能正常显示统计数据。
以下是修改的文件,

config_huangshan  Makefile  xt_qtaguid.c  xt_qtaguid_internal.h  xt_qtaguid_print.c  xt_qtaguid_print.h

修改如下:
config_huangshan 是基于linux_kernel/arch/arm/configs /nufront_config_huangshan的修改,只是打开了:
CONFIG_IP_NF_FILTER=y

除了config_huangshan之外的文件都copy到linux_kernel/net/netfilter/目录下即可

另外附上一个编译好的uImage,方便测试。

总结:

1. netfilter是linux默认的网络防火墙,他可以匹配各种规则来统计,拦截数据 收发。
2. qtaguid 是android为了做流量统计而加入kernel的,标准kernel(3.4)中没有合入
qtaguid的原理是:
上层提供应用的uid,kernel根据uid建立tag,并存入红黑树中,统计前台和后台 的收发数据,并保存在相应的
文件(/proc/net/xt_qtaguid/stats)等待上层读取。
在$android_source/system/core/libcutils中有qtaguid的接口,与kernel的 qtaguid对接
之所以在libcutils中加入,是为了让所以的java和c程序都能使用到这个接口。
再往上是java层的networkManagementSocketTagger和networkstatservice,他们 负责监听并更新uid列 表
并将应用的uid传入kernel
3.另外发现netd的带宽控制功能也是用iptables操作,需要打开netfilter的相关配置

你可能感兴趣的:(android流量统计的小结)