3 netd分析

3.1 CommandListener初始化

CommandListener的构造方法分为3大步骤:

1,父类初始化,传入netd socket

FrameworkListener("netd", true)

父类FrameworkListener的构造方法如下,

FrameworkListener::FrameworkListener(const char *socketName, bool withSeq) :SocketListener(socketName, true, withSeq) {init(socketName, withSeq);//初始化
}

父类SocketListener的构造方法如下,

SocketListener::SocketListener(int socketFd, bool listen) {init(NULL, socketFd, listen, false);
}

FrameworkListener的init方法创建了FrameworkCommandCollection list。

mCommands = new FrameworkCommandCollection();

FrameworkCommand.h中的FrameworkCommandCollection定义如下,

typedef android::sysutils::List<FrameworkCommand *> FrameworkCommandCollection;

SocketListener的init方法创建了SocketClientCollection list。

mClients = new SocketClientCollection();

SocketClient.h的SocketClientCollection定义如下,

typedef android::sysutils::List<SocketClient *> SocketClientCollection;

2 注册不同的命令,新建不同的命令处理类

新建了十多个父类都为NetdCommand的子类,然后添加到FrameworkCommandCollection中,最后新加命令处理类。

例如,

registerCmd(new PppdCmd());

父类FrameworkListener的构造方法如下,

void FrameworkListener::registerCmd(FrameworkCommand *cmd) {mCommands->push_back(cmd);
}

当然, NetdCommand继承于FrameworkCommand。

创建NetworkController对象如下,

sNetCtrl = new NetworkController();

3.2 socket监听/消息分发

从startListener方法开始,

cl->startListener()

SocketListener 的startListener方法如下,

int SocketListener::startListener() {return startListener(4);
}

startListener主要逻辑如下,

mSock = android_get_control_socket(mSocketName))  //获取socket
•••
listen(mSock, backlog) //监听客户端
•••
if (pthread_create(&mThread, NULL, SocketListener::threadStart, this)) //开启子线程监听socket

threadStart方法主要调用runListener方法,主要逻辑如下,

1, 等待Socket客户端发启连接请求

do {alen = sizeof(addr);c = accept(mSock, &addr, &alen);SLOGV("%s got %d from accept", mSocketName, c);
}

2,如果有客户端发起请求,说明有活动了,

pthread_mutex_lock(&mClientsLock);
mClients->push_back(new SocketClient(c, true, mUseCmdNum));//将活动放入mClients中

3,调用onDataAvailable方法处理活动,

while (!pendingList.empty()) {/* Pop the first item from the list */it = pendingList.begin();SocketClient* c = *it;pendingList.erase(it);/* Process it, if false is returned, remove from list */if (!onDataAvailable(c)) {release(c, false);}c->decRef();}

FrameworkListener的onDataAvailable方法首先读取socket的指令,然后调用dispatchCommand分发指令,

len = TEMP_FAILURE_RETRY(read(c->getSocket(), buffer, sizeof(buffer)));
•••
dispatchCommand(c, buffer + offset);

dispatchCommand从mCommands中取出注册的NetdCommand对象,逐个调用其runCommand方法。

for (i = mCommands->begin(); i != mCommands->end(); ++i) {FrameworkCommand *c = *i;if (!strcmp(argv[0], c->getCommand())) {if (c->runCommand(cli, argc, argv)) {SLOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno));}goto out;}
}

3.3 消息处理

如果是上层NetworkManagementService.java通过netd socket发送过来的消息,调用的就是CommandListener.cpp

的内部类NetworkCommand的runCommand方法,

runCommand方法逻辑很简单,根据解析的指令调用NetworkController对应的方法,例如,

if (!strcmp(argv[1], "interface")) {if (argc != 5) {return syntaxError(client, "Missing argument");}unsigned netId = stringToNetId(argv[3]);if (!strcmp(argv[2], "add")) { //add指令if (int ret = sNetCtrl->addInterfaceToNetwork(netId, argv[4])) {return operationError(client, "addInterfaceToNetwork() failed", ret);}} else if (!strcmp(argv[2], "remove")) { //remove指令 if (int ret = sNetCtrl->removeInterfaceFromNetwork(netId, argv[4])) {return operationError(client, "removeInterfaceFromNetwork() failed", ret);}} else {return syntaxError(client, "Unknown argument");}return success(client);}

最后处理完成之后,调用success方法通过socket向上层发送消息。最后会调用

SocketClient的sendDataLockedv方法发送,

for (;;) {ssize_t rc = TEMP_FAILURE_RETRY(writev(mSocket, iov + current, iovcnt - current));//写入socket

android netd守护进程机制 --- netd分析相关推荐

  1. 浅显理解*nix下的守护进程机制及fork函数

    最近空闲时间重新仔细看了一下memcached的使用说明文档,硬着头皮看了一点源码,有时候看到一些晦涩的c函数感觉实在恍惚只能跳过.不过也不算是全无收获,终于LZ还敢再看c语言,终于LZ又看起了c语言 ...

  2. Android 之 守护进程

    之前,低版本做守护进程时,就是两个service 相互守护,但是大于5.0后,似乎就不管用了,今天我们来看看,怎么解决这个问题,多的不说,直接上代码: 首先是有业务处理的service: public ...

  3. android 8 ril,Android系统启动——8 附录2:相关守护进程简介

    本次系列的内容如下: 在init.rc中定义了很多系统的守护进程,这里主要是做一些简单的介绍 一.uevent 负责相应uevent事件,创建设备节点文件: 代码在init.rc 550行 550se ...

  4. Android 系统(271)---进程、守护进程的实现及进程拉活

    进程.守护进程的实现及进程拉活 1,概念 1)守护进程(Daemon) 是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某些任务.android中守护进程的实现主要由Service来完成. ...

  5. Android任务、进程、线程详解

    任务.进程和线程     关于Android中的组件和应用,之前涉及,大都是静态的概念.而当一个应用运行起来,就难免会需要关心进程.线程这样的概念.在Android中,组件的动态运行,有一个最与众不同 ...

  6. Android 任务和进程

    关于Android中的组件和应用,之前涉及,大都是静态的概念.而当一个应用运行起来,就难免会需要关心进程.线程这样的概念.在Android中,组件的动态运行,有一个最与众不同的概念,就是Task,翻译 ...

  7. Android任务、进程和线程

    任务.进程和线程     关于Android中的组件和应用,之前涉及,大都是静态的概念.而当一个应用运行起来,就难免会需要关心进程.线程这样的概念.在Android中,组件的动态运行,有一个最与众不同 ...

  8. android任务 进程 线程详解,Android任务、进程、线程详解

    singleTop模式,基本上于standard分歧,仅正在请求的Activity反好位于栈顶时,无所区别.此时,配放成singleTop的Activity,不再会构制新的实例加入到Task栈外,而是 ...

  9. Android 系统内的守护进程 - main类服务(1) : netd

    声明 工作需要,分析netd 其实很好奇Android系统中的一些关键守护进程服务的作用: 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客: ...

最新文章

  1. python左移位运算_python移位运算符
  2. arduino实例1:led闪烁
  3. 跨界巨头谋定现代农业-农民丰收节交易会:全产业链布局
  4. atm系统的用例模型_战斗系统执行式测试经验汇总
  5. ming window 交叉编译_opencv3编译pc端及交叉编译arm端
  6. 重庆火锅哪家强,Python 帮你探探店
  7. FJ的字符串(字符串)
  8. 【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等
  9. 拓端tecdat|R语言:用R语言填补缺失的数据
  10. Oracle大神资料索引
  11. Component name “XXX“ should always be multi-word vue/multi-word-component-names
  12. 如何查看台式机计算机网络密码,如何在电脑上查找当前的WiFi网络密码
  13. angularjs防抖
  14. AE新手基础入门教程50套从新手到高手
  15. Android图片上传的两种方式
  16. python输入一组数字求平均值和标准差_如何计算PySpark DataFrame的平均值和标准差?...
  17. Beyond compare官方中文版下载
  18. 动态时间规整DWT(Dynamic Time Warping)
  19. Lua-cjson使用笔记
  20. 安科瑞变电站综合自动化系统在安庆市静脉产业园应用

热门文章

  1. 开箱即用!中文关键词抽取(Keyphrase Extraction),基于LDA与PageRank(TextRank, TPR, Salience Rank, Single TPR)
  2. linux文件读取程序,Linux系统编程:文件的读取写入
  3. 关于Unity ContentSizeFitter的坑
  4. java远程连接fpt_java远程连接本地fpt
  5. uva10306 - e-Coins(完全背包)
  6. Python中的numpy.cumsum()
  7. audio type多种类型_使用tensorflow进行音乐类型的分类
  8. 微星电脑不能u盘引导linux,微星电脑设置从U盘启动的三种方式
  9. 猜猜我是谁(猜数游戏)
  10. Python--详解脚本语言|编译语言|胶水语言的区别