上一篇:http://www.cnblogs.com/oscar1011/p/5243877.html

  之前做的iptables 来进行的联网控制,一直耿耿于怀,想要知道系统里的netd等等是如何做到执行那些命令,并能监听的。

  最近有机会又对这部分进行了一些研究。

  所要做的大概就是3部分,1. native进程,这部分得用c/c++来写,

               2. framework接口。用于和native进程通信。

               3. selinux权限配置,主要就是为了赋予natvie进程

             

  framework与native的通信这部分也是一个很有趣的地方,看了系统源码,很多模块使用了local socket进行上下层的通信。 好处就是稳定性高,而且另一点应该就是易封装,独立开来。

  1.下面就来稍作介绍native 进程的部分,

native的主要作用就是接收命令和执行命令,接收framework传输的命令,执行相应的shell 命令。

    此处有两个现成的类可供使用,FrameworkCommand 类,用于注册cmd,大概就是用于转发命令用的吧。

    另一个是 FrameworkListener, 用于注册socket监听, 该类new的时候需要传入一个string,监听对应名称的socket。 上层也需要使用该socket进行通信。该socket要和后面framework中使用的相对应。

    以下为代码部分

 #include <stdio.h>
#incldue <stdlib.h>
#define LOG_TAG "TEST" #include "CommandListener.h" int main(){ CommandListener *cl;
cl = new CommandListener();
cl->startListener(); //开始监听
while(){
sleep(); //循环,防止进程退出
ALOGE("sleep 10s ");
} return ;
}

main.cpp

 #include "CommandListener.h"

 CommandListener::CommandListener()
: FrameworkListener("test",true) {
registerCmd(new FirstTestCmd()); //注册对Test
} CommandListener::~CommandListener(){
} //此处的firsttest后面通信会用到
CommandListener::FirstTestCmd::FirstTestCmd()
: TestCommand("firsttest")
{ } int CommandListener::FirstTestCmd::runCommand(SocketClient *cli,
int argc, char **argv) {
ALOGE("Test %d", argc );
//对输入的参数进行处理
cli->sendMsg(""); //根据情况返回相应的信息
return ;
}

CommandListener.cpp

 #include "TestCommand.h"

 TestCommand::TestCommand(const char *cmd) :
FrameworkCommand(cmd) {
}

TestCommand.cpp

  

  2.framework接口部分

    这部分比较简单,只需要在service中创建一个线程,获取到socket,并提供开放接口供app调用即可。 获取socket输出流代码如下:

 LocalSocket socket = new LocalSocket();
OutputStream os = null;
LocalSocketAddress lsa = new LocalSocketAddress("test", LocalSocketAddress.Namespace.RESERVED); socket.connect(lsa);
os = socket.getOutputStream();
os.write("5 firsttest abc cdf\0".getBytes(StandardCharsets.UTF_8));

  而向这个流写入东西的时候也是有格式限制的,必须是【数字+空格+注册的CMD+空格+内容】的结构。因为当native收到数据时会需要返回一个数据,如果没有这个【数字】进行编号,很可能会导致信息的前后不对应。数据的返回监听一般是建立一个线程单独进行监听。

3.selinux 权限

    这块说实话,研究了好几天,感觉有些地方还是很难理解。这些权限的设置会直接影响到native 进程的功能。 而且权限有很多,必须得针对需要的权限进行研究添加,修改的目录一般就两个地方,external/sepolicy和device下面对应开发商的一个配置路径。

        至少得加3个地方, 声明native进程的类型,因为用到了socket,还得将socket声明出来,毕竟linux下万物归为文件。还有一个是对test进程的权限声明,这里就不写出来了,毕竟自己都不是很懂,省的误导人。需要用的小伙伴可以自行研究

  

/dev/socket/test    u:object_r:test_socket:s0
/system/bin/test u:object_r:test_exec:s0

sepolicy/file_contexts

 type test_socket, file_type;

sepolicy/file.te

iptables 完成联网控制 (续) ,独立native进程监听。的更多相关文章

  1. 获取Windows下某进程监听的TCP/UDP端口

    1.在Windows下用CMD netstat命令可以获得当前进程监听端口号的信息,如netstat -ano可以看到IP.port.状态和监听的PID. 那么可以执行CMD这个进程得到监听的端口号信 ...

  2. [技术博客]react native事件监听、与原生通信——实现对通知消息的响应

    在react native中会涉及到很多页面之间的参数传递问题.静态的参数传递通常利用组件的Props属性,在初始化组件时即可从父组件中将参数传递到子组件中.对于非父子关系的组件来说,无法直接传递参数 ...

  3. linux系统实现多个进程监听同一个端口

    通过 fork 创建子进程的方式可以实现父子进程监听相同的端口. 方法:在绑定端口号(bind函数)之后,监听端口号之前(listen函数),用fork()函数生成子进程,这样子进程就可以克隆父进程, ...

  4. Yii2.0 安装yii2-queue并在Linux启动守护进程监听消息

    一.什么是yii2-queue? Yii2-queue是Yii2.0 PHP框架下一个消息队列拓展插件,支持基于DB, Redis, RabbitMQ, AMQP, Beanstalk 和 Gearm ...

  5. e807. 设置进程监听对话框的延迟弹出

    By default, the progress monitor delays for a short period before it is displayed. There are two pro ...

  6. e806. 创建进程监听对话框

    A common feature of a user interface is to show a progress dialog that visually displays the progres ...

  7. mac oxs 上查看进程监听的端口号 lsof

    sudo netstat -ltnp |grep xxx lsof -p 26917 | grep LISTEN https://mengkang.net/1090.html

  8. Linux 文件锁flock 实现两个进程相互监听存活状态

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依参数operation所指 ...

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

    最近工作中,需要开发一个功能----联网控制,这个功能其实用过root的安卓机应该都知道,禁止某个应用连接移动网络或者wifi. root后,通过su去执行iptable的命令就可以根据uid去控制应 ...

随机推荐

  1. 学习c++语言应该牢记的50条准则,同样学习其他语言也一样

    1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programm ...

  2. LPC1768外部中断与GPIO中断

    LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 ...

  3. S3C2440看门狗解析

    个PCLK周期的复位信号 也就是说,在某些环境下,看门狗可以当做定时器使用,当他中断的时候并不发生复位,只发生中断,我看看图 看门狗的中断和复位信号是可以依靠wtcon来切断的(看门狗的时钟是无法切断 ...

  4. 浅谈IOS8之size class

    文章目录 1. 简介 2. 实验 3. 实战 3.1. 修改 Constraints 3.2. 安装和卸载 Constraints 3.3. 安装和卸载 View 3.4. 其他 4. 后话 以前和安 ...

  5. jsp发布后应用根目录

    1.发布到tomcat后获取应用的根目录 ServletContext s1=this.getServletContext(); String temp=s1.getRealPath("/& ...

  6. php连接mysql数据库(新浪云SAE)

    新浪云提供了免费的创建服务器端应用的服务.网址为:https://www.sinacloud.com/ 在上面创建好应用,然后在本地使用记事本编写应用的代码如下: <?php echo &quo ...

  7. BZOJ2720: [Violet 5]列队春游

    2720: [Violet 5]列队春游 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 173  Solved: 125[Submit][Status] ...

  8. linux 脚本保留日志

    使用tee使屏幕和文件都输出日志. 2 >&1中 2是错误输出,1是标准输出, 2>&1是标准和错误一起输出. repo sync 2>&1 | tee -a ...

  9. Subpub 订阅/发布

    var Pubsub = (function (window) { window.handlers = {}; var o = { pub: function () { var args = Arra ...

  10. FarPoint Spread ChildView子视图

    有一种需求场景在很多地方都会用到,就是父子关系(头表和子表的关系),比如订单和订单明细. 做过winform的朋友第spread控件应该比较熟悉,或者了解.他的展示方式就通过一个关联关系就可以了,下面 ...