上一篇: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. 如何成为一名优秀的UI设计师

    zccst整理 因为我自己就是一个 0 美术基础.非计算机.非艺术类科班出身,但从事视觉设计工作的同学,所以很多和题主一样大学里学着不喜欢的专业,想要转设计但又不知从何开始的朋友都来问过我类似的问题, ...

  2. 【转】国外程序员整理的 C++ 资源大全

    内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包括了STL容器,算法和函数等. C++ Standard Library:是一系列类 ...

  3. PHPCMS快速建站系列之自定义分页函数

    内容分页的实现方法:{pc:content action="lists" catid="$catid" order="id DESC" nu ...

  4. 《Web接口开发与自动化测试 -- 基于Python语言》 ---前言

    前    言 本书的原型是我整理一份Django学习文档,从事软件测试工作的这六.七年来,一直有整理学习资料的习惯,这种学习理解再输出的方式对我非常受用,博客和文档是我主要的输出形式,这些输出同时也帮 ...

  5. dom对象中的this和event.target区别

    1.this是事件冒泡,动态变化.先触发内部事件,由内到外的执行. <script> function testdiv(val){ console.log(val.id); } funct ...

  6. jfreechart图表汉字乱码问题解决方案

    系统工作迁移环境 linux centos 6.5 tomcat8 mysql5.6 系统部署上之后,所有的jfreechart图表上的汉字,全部乱码. 如图: 经分析: 1)数据库动态读出来的是正常 ...

  7. CodeForces 755C PolandBall and Forest (并查集)

    题意:给定每一点离他最远的点,问是这个森林里有多少棵树. 析:并查集,最后统计不同根结点的数目即可. 代码如下: #pragma comment(linker, "/STACK:102400 ...

  8. apache的工作模式 和 最大连接数设置

    经过测试 效果明显 (1)首选查看apache的工作模式 windows下的查看apache的工作模式命令:httpd -l 如果列出mod_win32.c,则表示是 win32.c 工作方式. 列出 ...

  9. PHPcms 把盛大登陆换成人人网登陆

    首先要确保你的 phpcms是比较新的版本, v9.3以后的吧 这里说明一个函数 rawurlencode() 本函数将字符串编码成 URL 的字符串专用格式,特殊的字符会转换成百分比符号后面加上二个 ...

  10. C# 编写通用的JSON数据进行序列化和反序列化

    注意事项:使用JSON系列化和反系列化,必须要添加引用System.Runtime.Serialization. 1.通用类代码如下: /// <summary>    /// JSON序 ...