参考Android源码的版本:4.0.4;init源码目录:system/core/init/;解析init脚本代码:init_parser.c;init脚本支持的关键字:keywords.h;
关于init.rc脚本相关的介绍可以参考system/core/init/readme.txt文件;纵观init源码,会发现init进程在启动的时候,会执行init脚本和一些内置的action。action定义为on <action name>,由command组成;执行action的时候,其实执行的是command;init脚本中的另一个支持的service节,本质上只是定义了服务,服务的启动也是通过action来启动的。init启动过程分为两步:init过程和boot过程;init过程是做一些全局的初始化,boot过程是为后面的服务做准备。
init进程的启动过程大致如下:
- 添加文件/dev/.booting以表示init正在启动中,进入init过程
- 初始化stdio和log
- 解析init脚本
- 执行名称为early-init的action
- 执行一些内置的action:wait_for_coldboot_done、property_init、keychord_init、console_init、set_init_properties
- 执行名称为init的action
- 执行一些内置的action:property_service_init、signal_init、check_startup。init过程结束,check_startup会删除文件/dev/.booting
- 执行名称为early-boot的action
- 执行名称为boot的action,boot过程结束。值得注意的是,在这个action的最后,会通过class_start等语句(比如:class_start core)来执行对应class的service,从而完成对service的启动。
- 执行内置的action:queue_propety_triggers