守护进程框架简单分析 (基于NetD)
来源:互联网 发布:伊藤润二漫画全集淘宝 编辑:程序博客网 时间:2024/06/04 19:40
守护进程框架简单分析 (基于NetD)
Main.cpp
- CommandListener对象,用于接收Framework层通过socket传下来的指令。
- NetlinkManager对象,创建与底层通信的Netlink Socket。
- MDnsSDListener对象
CommandListener.cpp
继承自FrameworkListener–SocketListener
传进Netd字符串,作为将要监听的socket的name.
FrameworkListener中新建mCommands list用来将要register的cmd.typedef android::sysutils::List<FrameworkCommand *> FrameworkCommandCollection;
- CommandListener中registerCmd注册各种自定义的Command。其父类FrameworkListener中将其将入到mCommands中去。
自定义的Command继承自NetdCommand,其祖父类为FrameworkCommand.其构造参数为Command名字。
自定义的Command必须重写runCommand函数,该函数为Command的具体处理函数。
自定义control类,协助处理对应Command的runCommand函数。 - SocketListener中间听到客户端的消息后,回调FrameworkListener的onDataVailable函数,参数cli为客户端信息,然后根据命令信息,回调对应命令的runCommand函数。cli可用于向客户端反馈信息。
- SocketListener中sendBroadcast可以广播通知所有客户端。
NetlinkManager.cpp
- NetlinkManager的start函数中,调用setupSocekt创建Netlink Socket,并创建一个NetlinkHandler监听Netlink。
- NetlinkHandler继承自NetlinkListener。因此,如果Netlink Socket接收到消息,同样回调onDataVailable函数。
onDataVailable函数中会新建一个NetlinkEvent对象,并调用该对象的decode函数解析Netlink Socket接收到的数据。decode函数中会根据NetlinkListener的format确定解析方法,以二进制解析还是ascii解析。解析完成后回调Netlink Handler的onEvent,将解析数据传递出来。
Netd中的Netlink Handler的onEvent函数中会将结果通过CommandListener的sendBroadcast功能notify给framework层。
MDnsSDListener.cpp
原理与CommandListener类似,不展开介绍。
Framework层
NativeDaemonConnector类为Framework与守护进程通讯的工具类,会在NetworkManagermentService中被使用到。NativeDaemonConnector主要做两件事:1、接收底层反馈,2、向守护进程发送命令。
1. NativeDaemonConnector继承自Runnable,因此start后调用run函数,即可开始监听守护进程的socket。
interface INativeDaemonConnectorCallbacks { void onDaemonConnected(); boolean onCheckHoldWakeLock(int code); boolean onEvent(int code, String raw, String[] cooked); }
NativeDaemonConnector构造函数第一个参数即为回调函数,该回调函数必须继承上面这个接口,并实现其函数
NativeDaemonConnector在start后即开始监听,监听到消息后封装成NativeDaemonEvent交由本身的handleMessage处理,handleMessage会回调用户回调函数的onEvent函数。
NativeDaemonEvent的parse函数可知,守护进程上传的数据格式为“CmdNumber Code Message”
2. NativeDaemonConnector的execute函数,向守护进程发命令。
不需要回复的命令直接写入socket即可
需要回复的命令:
makeCommand(rawBuilder, logBuilder, sequenceNumber, cmd, args);
自加一个sequenceNumber作为codeNumber拼接成命令,linsen socket的时候接收到消息后
if (event.isClassUnsolicited()) { } else { //将回复消息加入回复队列 mResponseQueue.add(event.getCmdNumber(), event); }
execute延迟后读取mResponseQueue队列,根据之前设置的sequenceNumber
do { //延迟读取sequenceNumber命令 event = mResponseQueue.remove(sequenceNumber, timeout, logCmd); if (event == null) { loge("timed-out waiting for response to " + logCmd); throw new NativeDaemonFailureException(logCmd, event); } events.add(event); //代表接收到的event是否只是其中一段 } while (event.isClassContinue());
关于event的codeNumber类型:
/** * Test if event represents a partial response which is continued in * additional subsequent events. */mCode >= 100 && mCode < 200;/** * Test if event represents a command success. */mCode >= 200 && mCode < 300;/** * Test if event represents a remote native daemon error. */pmCode >= 400 && mCode < 500;/** * Test if event represents a command syntax or argument error. */ mCode >= 500 && mCode < 600;/** * Test if event represents an unsolicited event from native daemon. */code >= 600 && code < 700;
- 守护进程框架简单分析 (基于NetD)
- android netd守护进程机制 --- netd分析
- android netd守护进程机制 --- Java层分析
- 守护进程C实现简单分析
- 守护进程框架
- 基于linux 守护进程的分析与实现
- 基于Linux守护进程的分析与实现
- 守护进程简单实现
- 编写简单守护进程
- 守护进程简单实现
- 守护进程分析
- dhcpcd守护进程分析
- Android Netd详细分析(一)概述
- 一只简单的网络爬虫(基于linux C/C++)————守护进程
- php守护进程管理框架
- 守护进程开源框架
- Linux简单的守护进程
- 一个简单的守护进程
- 中国有哪些编程牛人?
- 使用LitJson.dll生成存储与解析Json
- 算法学习之旅,初级篇(5)--数码平方和
- centos6.8安装开发环境1之安装JDK
- 生产环境发布遇到的问题
- 守护进程框架简单分析 (基于NetD)
- 【文献阅读】Self-Normalizing Neural Networks
- Python发展简史
- Linux之文件学习笔记
- 动态规划之最长公共子序列 代码详解
- ActiveMQ5.11.1必须在JDK1.7以上版本才能使用。
- iOS 归档
- 关于前台URL传递中文参数到java后台乱码的问题
- Laravel框架一:原理机制篇