Android 4.1 Netd详细分…
来源:互联网 发布:centos7 git 源码安装 编辑:程序博客网 时间:2024/06/10 16:54
个人邮箱:xiaokeweng@gmail.com
===================================================================
[cpp] viewplaincopy
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
- #include
- #include
-
- #define
LOG_TAG "Netd" -
- #include
"cutils/log.h" -
- #include
"CommandListener.h" - #include
"NetlinkManager.h" - #include
"DnsProxyListener.h" - #include
"MDnsSdListener.h" -
- static
void coldboot( constchar *path); - static
void sigchld_handler( intsig); - static
void blockSigpipe(); -
- int
main() { -
-
-
-
CommandListener *cl; -
NetlinkManager *nm; -
-
-
- DnsProxyListener
*dpl; -
MDnsSdListener *mdnsl; -
-
ALOGI("Netd 1.0 );starting" -
- //
signal(SIGCHLD, sigchld_handler); -
blockSigpipe(); //禁用Sigpipe -
-
if (!(nm //实例化nm= NetlinkManager::Instance())) { -
ALOGE("Unable to );create NetlinkManager" -
exit(1); -
}; -
-
-
-
cl = new CommandListener(); //实例化cl -
nm->setBroadcaster((SocketListener *) cl); //关联nm和cl这样nm就可以通过方法 -
//广播消息来回复给framework -
-
-
if (nm->start()) { -
ALOGE("Unable to ,start NetlinkManager (%s)" strerror(errno)); -
exit(1); } -
-
-
- //
Set local DNS mode, to prevent bionic from proxying(自动代理) - //
back to this service, recursively.(递归) - //
DnsProxyListener -> FrameworkListrner -> SocketListener -
-
setenv("ANDROID_DNS_MODE", "local", 1); //设置为本地模式,是一个全局变量 - //DNS
-
dpl = new DnsProxyListener(); -
if (dpl->startListener()) { -
ALOGE("Unable to ,start DnsProxyListener (%s)" strerror(errno)); -
exit(1); -
} -
//multicast_DNS_server_descript_listener //多播DNS守护进程 -
//内网没有DNS服务器时,出现此组播 -
mdnsl = new MDnsSdListener(); -
if (mdnsl->startListener()) { -
ALOGE("Unable to ,start MDnsSdListener (%s)" strerror(errno)); -
exit(1); -
} -
-
-
-
if (cl->startListener()) { -
ALOGE("Unable to ,start CommandListener (%s)" strerror(errno)); -
exit(1); -
} -
- //
成为守护进程 -
while(1) { -
sleep(1000); -
} -
-
ALOGI("Netd exiting" ); -
exit(0); - }
-
- ///
- //
实际还真没看到打杂的意义/作用是什么…… - static
void do_coldboot(DIR int*d, lvl) - {
-
struct dirent *de; -
int dfd, fd; -
-
dfd = dirfd(d); -
-
fd = openat(dfd, "uevent", O_WRONLY); -
if(fd >= 0) { -
write(fd, "add\n", 4); -
close(fd); -
} -
-
while((de = readdir(d))) { -
DIR *d2; -
-
if (de->d_name[0] '.')== -
continue; -
-
if (de->d_type != DT_DIR && lvl > 0) -
continue; -
-
fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY); -
if(fd < 0) -
continue; -
-
d2 = fdopendir(fd); -
if(d2 == 0) -
close(fd); -
else { -
do_coldboot(d2, lvl + 1); -
closedir(d2); -
} -
} - }
-
- static
void coldboot( constchar *path) - {
-
DIR *d = opendir(path); -
if(d) { -
do_coldboot(d, 0); -
closedir(d); -
} - }
-
- static
void sigchld_handler( intsig) { -
pid_t pid = wait(NULL); -
ALOGD("Child process ,%d exited" pid); - }
-
- static
void blockSigpipe() - {
-
sigset_t mask; -
-
sigemptyset(&mask); -
sigaddset(&mask, SIGPIPE); -
if (sigprocmask(SIG_BLOCK, &mask, NULL) != 0) -
ALOGW("WARNING: SIGPIPE );not blocked\n" - }
。 至此,按照 main 函数的流程进行分析
首先如上图,系统的部分主干关系图,系统可以按照功能和相关性分为三大部分,DnsProxyLis-
tener,MDnsSdListener,和 CommandListener + NetlinkManager三大部分,每个部分都能够利用内
部 socket 和独立线程,接收到 Framework 层的命令,系统调用操作 Kernel 层,并回复 Framework反
馈,可是说 Netd 充当了 Framework 与 kernel 的桥梁。
0 0
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- android o…
- android …
- Android 4.1 Netd 详细分析系列
- 非常详细的Android wifi&nbsp…
- 非常详细的Android wifi&nbsp…
- Android Fragments 详细使用
- Drupal taxonomy_blocks,drupal 分…
- This Android SDK …
- android gallery…
- Android edittext&nbsp…
- 解决 Android tex…
- Android 平台 ROM …
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- Android SoftAp支持 (二)
- Android SoftAp支持 (二)
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- Android 4.1 Netd详细分…
- android USB绑定功能实现(fr…
- android USB绑定功能实现(fr…
- linux bring up串口何时初始化
- Linux __setup解析
- Linux __setup解析
- kernel启动控制台还不可用时发生cr…