Android的初始化语言脚本init.rc解析

Android init.rc (Android init language)Android初始化语言由四大类声明组成:行为类(Actions),命令类(Commands),服务类(Services),选项类(Options).? * 初始化语言以行为单位,由以空格间隔的语言符号组成。C风格的反斜杠转义符可以用来插入空白到语言符号。双引号也可以用来防止文本被空格分成多个语言符号。当反斜杠在行末时,作为折行符。? * 以#开始(前面允许有空格)的行为注释行。? * Actions和Services隐含声明一个新的段落。所有该段落下Commands或Options的声明属于该段落。第一段落前的Commands或Options被忽略。? * Actions和Services拥有独一无二的命名。在它们之后声明相同命名的类将被当作错误并忽略。Actions-------Actions是一系列命令的命名。Actions拥有一个触发器(trigger)用来决定action何时执行。当一个action在符合触发条件被执行时,如果它还没被加入到待执行队列中的话,则加入到队列最后。队列中的action依次执行,action中的命令也依次执行。Init在执行命令的中间处理其它活动(设备创建/销毁,property设置,进程重启)。Actions表现形式为:on ?? ?? ?? ?Services--------Services是由init启动,在它们退出时重启(可选)。Service表现形式为:service [ ]*?? ?? ?? ...? Options-------Options是Services的修饰,它们影响init何时、如何运行service.?critical???? 这是一个设备关键服务(device-critical service) .如果它在4分钟内退出超过4次,设备将重启并进入恢复模式。?disabled???? 这个服务的级别将不会自动启动,它必须被依照服务名指定启动才可以启动。?setenv ???? 设置已启动的进程的环境变量的值?socket [ [ ] ]???? 创建一个名为/dev/socket/的unix domin socket,并传送它的fd到已启动的进程。必须为"dgram"或"stream".用户和组默认为0.?user ???? 在执行服务前改变用户名。当前默认为root.如果你的进程需要linux能力,你不能使用这个命令。你必须在还是root时请求能力,并下降到你需要的uid.?group [ ]*???? 在执行服务前改变组。在第一个组后的组将设为进程附加组(通过setgroups()).当前默认为root.?oneshot???? 在服务退出后不重启。?class ???? 为service指定一个类别名。同样类名的所有的服务可以一起启动或停止。如果没有指定类别的服务默认为"default"类。?onrestart?????? 当服务重启时执行一个命令。?Triggers--------???? Triggers(触发器)是一个字符串,可以用来匹配某种类型的事件并执行一个action。?boot???? 这是当init开始后执行的第一个触发器(当/init.conf被加载)?=???? 当property 被设为指定的值时触发。?device-added-device-removed-???? 当设备节点被添加或移除时触发。?service-exited-???? 当指定的服务存在时触发??Commands--------?exec [ ]*???? Fork并执行一个程序().这将被block直到程序执行完毕。最好避免执行例如内建命令以外的程序,它可能会导致init被阻塞不动。?export ???? 设定全局环境变量的