作为天字第一号进程,如果想学习深入解析Android源码觉得还是有必要了解一下init的,虽然我看的懵懵懂懂。
天字一号就是PID=1的进程,可以通过PS
命令查看。
工作:
- 创建文件,并挂载设备,Linux系统初始化类似
- 解析init.rc配置文件
- 通过读取/proc/cpuinfo/得到机器Hardware名,然后解析init.Hardware.rc文件
- 执行动作,按时间分为四种:early-init,init,early-boot,boot;事件顺序由配置文件决定
- 创建利用Uevent与Linux内核交互的socket
- 初始化属性相关资源
解析配置文件
调用parse_config()方法解析
查找配置文件的section,然后针对不同的section使用不同的解析函数来解析。
section定义在keywords.h中,当symbol为on或service的时候表示section
zygote 也是一个service section
解析service
parse_service() //该函数只是搭建了一个service的架子
parse_line_service() //填充内容
init控制Service
** 启动zygote 服务**
init.rc中有这样一句话
#class_start 是一个COMMAND,对应的函数为do_class_start
class_start default
当init执行到
//将boot section 节的command加入到执行队列
action_for_each_trigger("boot",action_add_queue_tail);
//执行队列里的命令,class是一个COMMAND,多以它对应的是do_class_start会被执行
重启zygote
drain_action_queue(); //poll函数返回后,会进入下一轮的循环
restart_processes(); //这里会重启flag标志为SVC_RESTARTING的service.
属性服务
相当于windows下的注册表,系统重启或应用程序重启,可以根据注册表中属性,进行相应的初始化组工作。
查看属性
$ adb shell
$ getprop
property_init(); //属性初始化
property_set_fd = start_property_service(); //属性设置
当然init还有很多功能,比如说
- 设置开机界面
- 初始化/dev/keychord设备
等等
参考书籍:
《深入解析Android 卷I》