init.rc是一个可配置的初始化文件,通常定制厂商可以配置额外的初始化配置,init.%PRODUCT%.rc。init.rc 由如下四种类型语句组成:Actions Commands Services Options
一个actions 或 services 的开始隐含声明了一个新的段,所有commands 或 options 属于最近的声明。每一个actions 和 services 都有不同的名字。
Actions其实就是一组被命名的命令序列。actions 都有一个触发条件,触发条件决定了action何时执行。当一个事件发生如果匹配action的触发条件,那么这个action将会被添加到预备执行队列的尾部(除非它已经在队列当中) 每一个action中的命令将被顺序执行。action 的格式如下:
on <trigger>
<command>
<command>
<command>
services 是一些由init 启动 和 重新(如果有需要)启动的程序,当然这些程序如果是存在的。
services 的格式如下:
service <name> <pathname> [ <argument> ]*
<option>
<option>
critical 表示如果服务在4分钟内存在多于4次,则系统重启到recovery mode
disabled 表示服务不会自动启动,需要手动调用名字启动
setEnv <name> <value> 设置启动环境变量
socket <name> <type> <permission> [<user> [<group>]] 开启一个unix域的socket,
名字为/dev/socket/<name> , <type>只能是dgram或者stream,<user>和<group>默认为0
user <username> 表示将用户切换为<username>,用户名已经定义好了,只能是system/root
group <groupname> 表示将组切换为<groupname>
oneshot 表示这个service只启动一次。
class <name> 指定一个要启动的类,这个类中如果有多个service,将会被同时启动。
默认的class将会是“default”。
onrestart 在重启时执行一条命令
trigger主要包括:
boot 当/init.conf加载完毕时
<name>=<value> 当<name>被设置为<value>时
device-added-<path> 设备<path>被添加时
device-removed-<path> 设备<path>被移除时
service-exited-<name> 服务<name>退出时
- on early-init
- on init
- on fs
- on post-fs
- on boot
- on property:ro.secure=0
- on property:ro.kernel.qemu=1
- on property:persist.service.adb.enable=1
- //这些触发是由init.c里的函数action_for_each_trigger来决定的:
- action_for_each_trigger("early-init", action_add_queue_tail);
- action_for_each_trigger("init", action_add_queue_tail);
- action_for_each_trigger("early-fs", action_add_queue_tail);
- action_for_each_trigger("fs", action_add_queue_tail);
- action_for_each_trigger("post-fs", action_add_queue_tail);
- action_for_each_trigger("early-boot", action_add_queue_tail);
- action_for_each_trigger("boot", action_add_queue_tail);