android 4.3 framework之init深入

   init.c(system/core/init/init.c)

  Linux系统中用户空间的第一个进程,main函数中主要解析了两个配置文件,init.rc和硬件相关的配置文件,解析调用的是 init_parse_config_file,在Ueventd_Parser.c的Parse_config进行解析,首先找到配置文件的section,不同的section使用不同的方式去解析, section为当symbol为on或者service的时候表示section,4.3加入了import关键字,在init.rc中

 on init : on关键字,对应的section名字是init

 分析init.rc文件

1、section的内容从标识开始,到下一个section结束

        2、boot和init在on这个section中,

   解析service section:

          init.h中使用service结构体,通过Initparse.c中的parse_service和parse_line_service将配置文件的内容填充于service结构体中。

  init控制Service:

         1、启动zygote,当init进程执行到do_class_start时,即启动service,因为zygote的classname为default,因此在init.rc中 #class_start 为                    default,在init.c中zygote

               通过fork(创建子线程)和execve(执行新的service)共同创建。

          2、重启zygote,在init.rc中 poll事件中有个SVC_RESTARTING标识,设置了它,执行service中的onrestart命令,在init.c的for循环中,执                 行restart_processes,重启所有标识为SVC_RESTARTING的service。


属性服务(property service),类似于注册表,重启后键值依然存在

       1、属性服务的初始化,init_property_aera()初始化存储空间,PA_SIZE 32768个字节,PA_INFO_START(1024)个字节存储头部信息

       2、由init创建在共享内存上,而共享内存可以跨进程,(init_workspace),客户端可以直接读取属性空间,只有读权限。

       3、客户端想要设置属性,需要通过属性服务器来交互,客户端通过property_set发送请求,init进程由start_property_service启动服务,创建              了一个用来接收请求的socket,收到后调用handle_property_set_fd进行处理,检查是否有权限,如果有,调用property_set修改属性值。


你可能感兴趣的:(android 4.3 framework之init深入)