framework层和native层实现联网控制(iptable方式)


最近工作中,需要开发一个功能—-联网控制,这个功能其实用过root的安卓机应该都知道,禁止某个应用连接移动网络或者wifi。root后,通过su去执行iptable的命令就可以根据uid去控制应用联网权限但是由于公司是做手机系统开发,手机生产出来不允许带有root权限,所以我们完成这个功能也是不可以使用root权限去实现的。由于第一次做这种功能,刚开始我居然天真的以为系统中带有这种控制权限的接口,然后只有个Internet权限,无法区分数据流量和wifi。嗯,直接上最终实现的方式。当时发现手机上有个功能是限制应用后台数据流量,该功能如其所述就是限制应用在后台状态下无法使用流量。通过代码追溯,找到其调用到的是一个NetworkManagementService.java这个Service,方法就是下面这个,里面的mConnector就是用来封装发送命令的类。有兴趣的可以自己去看一下 —>NativeDaemonConnector.java通过搜索addnaughtyapps这个关键字,在CommandListener.cpp 这个类中找到了解析这个命令的地方,最终在BandwidthController.cpp这个类中执行操作iptable的命令,Ok,既然这个S免费云主机域名ervice拥有直接执行iptable的权限,那么我们就直接在里面添加我们需要的方法不就OK了吗。因此,1. 在CommandListener.cpp 中加入过滤关键字的判断,2. 在NetworkManagementService.java中加入接口去发送命令,3. 最终实现在BandwidthController.cpp 中进行。第三步主要就是iptable的操作了,如何使用网上很多,不过当时我还真是看了好久才弄懂iptable的操作……用到的主要就是 -I 和 -D 命令。其实比起这些,我更好奇netd 进程是如何拥有执行root命令的权限的。等有空了一定要研究下。目前只知道在init.rc中可以配置以root权限去启动service。

相关推荐: Cent OS 6.5 下安装Quagga 报错 vtysh needs libreadline

Centos 6.5 下安装 quagga-0.99.22 时遇到如下提示./configure –prefix=/usr/local/zebra –enable-vtysh –enable-user=root –enable-group=root -…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/27 11:09
下一篇 01/27 11:10