framework层和native层实现联网控制(iptable方式)
来源:互联网 发布:淘宝店家如何开通花呗 编辑:程序博客网 时间:2024/06/17 14:36
最近工作中,需要开发一个功能----联网控制,这个功能其实用过root的安卓机应该都知道,禁止某个应用连接移动网络或者wifi。
root后,通过su去执行iptable的命令就可以根据uid去控制应用联网权限
但是由于公司是做手机系统开发,手机生产出来不允许带有root权限,所以我们完成这个功能也是不可以使用root权限去实现的。
由于第一次做这种功能,刚开始我居然天真的以为系统中带有这种控制权限的接口,然后只有个Internet权限,无法区分数据流量和wifi。
嗯,直接上最终实现的方式。
当时发现手机上有个功能是限制应用后台数据流量,该功能如其所述就是限制应用在后台状态下无法使用流量。通过代码追溯,找到其调用到的是一个 NetworkManagementService.java 这个Service,方法就是下面这个,里面的mConnector就是用来封装发送命令的类。有兴趣的可以自己去看一下 ---> NativeDaemonConnector.java
@Override public void setUidNetworkRules(int uid, boolean rejectOnQuotaInterfaces) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled if (!mBandwidthControlEnabled) return; synchronized (mQuotaLock) { final boolean oldRejectOnQuota = mUidRejectOnQuota.get(uid, false); if (oldRejectOnQuota == rejectOnQuotaInterfaces) { // TODO: eventually consider throwing return; } try { mConnector.execute("bandwidth", rejectOnQuotaInterfaces ? "addnaughtyapps" : "removenaughtyapps", uid); if (rejectOnQuotaInterfaces) { mUidRejectOnQuota.put(uid, true); } else { mUidRejectOnQuota.delete(uid); } } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } } }
通过搜索addnaughtyapps这个关键字,在 CommandListener.cpp 这个类中找到了解析这个命令的地方,
if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { if (argc < 3) { sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ..."); return 0; } int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); sendGenericOkFail(cli, rc); return 0; }
最终在BandwidthController.cpp这个类中执行操作iptable的命令,
Ok,既然这个Service拥有直接执行iptable的权限,那么我们就直接在里面添加我们需要的方法不就OK了吗。
因此,
1. 在CommandListener.cpp 中加入过滤关键字的判断,
2. 在NetworkManagementService.java中加入接口去发送命令,
3. 最终实现在BandwidthController.cpp 中进行。
第三步主要就是iptable的操作了,如何使用网上很多,不过当时我还真是看了好久才弄懂iptable的操作......用到的主要就是 -I 和 -D 命令。
其实比起这些,我更好奇netd 进程是如何拥有执行root命令的权限的。等有空了一定要研究下。
目前只知道在init.rc中可以配置以root权限去启动service。
- framework层和native层实现联网控制(iptable方式)
- struts2的视图层和控制层之间的通信(数据传递)方式。
- Android Service Framework (Native层的一个例子)
- android framework surface native 层渲染
- Binder(native层)
- 数据控制层实现
- 【OpenGL】native层OpenGL实现
- MiniGUI 体系结构之四——图形抽象层和输入抽象层及 Native Engine 的实现(一)
- MiniGUI 体系结构之四——图形抽象层和输入抽象层及 Native Engine 的实现(二)
- Framework层(应用框架层)
- Android的framework层音量控制原理
- Framework层Ril控制流程分析
- Framework层Ril控制流程分析
- 图形抽象层和输入抽象层及 Native Engine 的实现
- JDBC之控制层和视图层
- Android的LocalSocket实现及SELinux权限设置.编译(应用层和native通信)
- Posix本地通信用于同一设备或native和framework层之间
- android Framework层添加资源方式
- input子系统三 核心层和处理器注册
- File类中的list和listFiles方法
- Jquery(八) 属性过滤
- wampserver 3.0.X以上版本怎么切换启用服务器在线状态
- UVA 11426 GCD
- framework层和native层实现联网控制(iptable方式)
- C#
- 图片缓存策略
- ES6新特性之迭代器与for-of循环
- js获取、设置元素css属性值
- 使用spring注解@Controller @Service @Repository简化配置
- 添加第三方jar包到nexus库(by -louis)
- python实现12306车票查询
- Spring IOC AOP学习