Android 4.1 Netd详细分…

来源:互联网 发布:centos7 git 源码安装 编辑:程序博客网 时间:2024/06/10 16:54

个人邮箱:xiaokeweng@gmail.com

 

 

      接下来开始从代码分析,按照从下至上的顺序来分析,从native层向framework层过渡,Android的各个层之间严格按照软件工程原理的低耦合要求,关于Android的系统框架可以参考附录:link~(待完善)

      在Netd部分使用到得Socket通信,关于Android内部的IPC机制可以参考附录:link~(待完善)

===================================================================

[cpp] viewplaincopy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9.   
  10. #include   
  11. #include   
  12.   
  13. #define LOG_TAG "Netd"  
  14.   
  15. #include "cutils/log.h"  
  16.   
  17. #include "CommandListener.h"  
  18. #include "NetlinkManager.h"  
  19. #include "DnsProxyListener.h"  
  20. #include "MDnsSdListener.h"  
  21.   
  22. static void coldboot(const char *path);  
  23. static void sigchld_handler(int sig);  
  24. static void blockSigpipe();  
  25.   
  26. int main()  
  27.   
  28.   
  29.   
  30.     CommandListener *cl;  
  31.     NetlinkManager *nm;  
  32.   
  33.   
  34.       
  35.   DnsProxyListener *dpl;  
  36.     MDnsSdListener *mdnsl;  
  37.   
  38.     ALOGI("Netd 1.0 starting");  
  39.   
  40. //  signal(SIGCHLD, sigchld_handler);  
  41.     blockSigpipe();         //禁用Sigpipe  
  42.   
  43.     if (!(nm NetlinkManager::Instance()))   //实例化nm  
  44.         ALOGE("Unable to create NetlinkManager");  
  45.         exit(1);  
  46.     };  
  47.   
  48.   
  49.    
  50.     cl new CommandListener();         //实例化cl  
  51.     nm->setBroadcaster((SocketListener *) cl);   //关联nm和cl这样nm就可以通过方法  
  52.                         //广播消息来回复给framework  
  53.   
  54.    
  55.  if (nm->start())  
  56.      ALOGE("Unable to start NetlinkManager (%s)"strerror(errno));   
  57.     exit(1);  
  58.   
  59.   
  60.    
  61. // Set local DNS mode, to prevent bionic from proxying(自动代理)   
  62. // back to this service, recursively.(递归)   
  63. // DnsProxyListener -> FrameworkListrner -> SocketListener  
  64.      
  65.     setenv("ANDROID_DNS_MODE""local"1);         //设置为本地模式,是一个全局变量      
  66. //DNS  
  67.     dpl new DnsProxyListener();  
  68.     if (dpl->startListener())  
  69.         ALOGE("Unable to start DnsProxyListener (%s)"strerror(errno));  
  70.         exit(1);  
  71.      
  72.                             //multicast_DNS_server_descript_listener                                        //多播DNS守护进程  
  73.                         //内网没有DNS服务器时,出现此组播  
  74.     mdnsl new MDnsSdListener();  
  75.     if (mdnsl->startListener())  
  76.         ALOGE("Unable to start MDnsSdListener (%s)"strerror(errno));  
  77.         exit(1);  
  78.      
  79.   
  80.   
  81.   
  82.     if (cl->startListener())  
  83.         ALOGE("Unable to start CommandListener (%s)"strerror(errno));  
  84.         exit(1);  
  85.      
  86.       
  87. // 成为守护进程  
  88.     while(1)  
  89.         sleep(1000);  
  90.      
  91.   
  92.     ALOGI("Netd exiting");  
  93.     exit(0);  
  94.  
  95.    
  96. ///  
  97. // 实际还真没看到打杂的意义/作用是什么……  
  98. static void do_coldboot(DIR *d, int lvl)  
  99.  
  100.     struct dirent *de;  
  101.     int dfd, fd;  
  102.   
  103.     dfd dirfd(d);  
  104.   
  105.     fd openat(dfd, "uevent"O_WRONLY);  
  106.     if(fd >= 0)  
  107.         write(fd, "add\n"4);  
  108.         close(fd);  
  109.      
  110.   
  111.     while((de readdir(d)))  
  112.         DIR *d2;  
  113.   
  114.         if (de->d_name[0] == '.' 
  115.             continue 
  116.   
  117.         if (de->d_type != DT_DIR && lvl 0)  
  118.             continue 
  119.   
  120.         fd openat(dfd, de->d_name, O_RDONLY O_DIRECTORY);  
  121.         if(fd 0)  
  122.             continue 
  123.   
  124.         d2 fdopendir(fd);  
  125.         if(d2 == 0)  
  126.             close(fd);  
  127.         else  
  128.             do_coldboot(d2, lvl 1);  
  129.             closedir(d2);  
  130.          
  131.      
  132.  
  133.   
  134. static void coldboot(const char *path)  
  135.  
  136.     DIR *d opendir(path);  
  137.     if(d)  
  138.         do_coldboot(d, 0);  
  139.         closedir(d);  
  140.      
  141.  
  142.   
  143. static void sigchld_handler(int sig)  
  144.     pid_t pid wait(NULL);  
  145.     ALOGD("Child process %d exited"pid);  
  146.  
  147.   
  148. static void blockSigpipe()  
  149.  
  150.     sigset_t mask;  
  151.   
  152.     sigemptyset(&mask);  
  153.     sigaddset(&mask, SIGPIPE);  
  154.     if (sigprocmask(SIG_BLOCK, &mask, NULL) != 0)  
  155.         ALOGW("WARNING: SIGPIPE not blocked\n");  
  156.  



      至此,按照 main 函数的流程进行分析

      首先如上图,系统的部分主干关系图,系统可以按照功能和相关性分为三大部分,DnsProxyLis-
tener,MDnsSdListener,和 CommandListener + NetlinkManager三大部分,每个部分都能够利用内
部 socket 和独立线程,接收到 Framework 层的命令,系统调用操作 Kernel 层,并回复 Framework反
馈,可是说 Netd 充当了 Framework 与 kernel 的桥梁。

0 0
原创粉丝点击