Android设备的启动必须经历三个阶段:Bootloader、Linux Kernel和Android系统服务。严格来说,Android系统实际是运行于Linux内核之上的一系列“服务进程”,而这些服务进程的“老祖宗”就是init,它是Android中第一个被启动的进程,因此PID号为0,它通过解析init.rc(就是一个脚本文件,很简单,但也很重要!!!)来构建出系统的初始运行形态:即其他Android系统服务程序大多是在这个rc脚本中描述并被按着一定的条件启动
二、rc文件的解析1.Google对于init.rc文件的唯一注解在AOSP下的/system/core/init/Readme.txt
如果想了解,请跳转
2.除了这个txt文件,与init.rc解析相关的代码在init_parser.c中
三、rc文件结构3.1.init.rc脚本由4种类型的声明构成:
Actions(行为)
Commands(命令)
Services( 服务)
Options(选项)
3.2.通用语法规则
“#”号注释
关键字和参数以空格分隔,每个语句以行为单位
C语言风格的放斜杠转义符('')可以用来为参数添加空格
字符串中如果有使用到空格,需要对空格加双引号,like this" "
行尾有反斜杠'',和C语言一样,表示下一行和这行是同一个
Actions和Services暗示着一个新语句的开始,这两个关键字后面跟着的Commands或者Options都属于这个新语句
Actions和Services有唯一的名字,如果出现和已有Actions或者Services重名的,将会被当作错误忽略掉
四、rc文件语法介绍4.1.Actions(动作)
1)动作的基本格式(可以执行多个命令)
on##出发条件 ##命令1 ##命令2 ##命令3 ...
2)解释一下
一个Action就是响应某个事件的过程,即当
从源码实现上看,当事件发生后,系统会对init.rc中各
3)有哪些
on boot #系统启动触发 on early-init #在初始化之前触发 on init #在初始化时触发(在启动配置文件/init.conf被装载之后) on late-init #在初始化晚期阶段触发 on charger #当充电时触发 on property:= #当属性值满足条件时触发 on post-fs #挂载文件系统 on post-fs-data #挂载data on device-added- #在指定设备被添加时触发 on device-removed- #在指定设备被移除时触发 on service-exited- #在指定service退出时触发 on = #当属性 等于 时触发
4.2.Commands(命令)
1)命令将在所属事件发生(也就是
2)常见的Command请看下面
| exec | fork并执行一个程序,其路径为 |
| export | 设置某个环境变量 |
| ifup | 使网络接口 |
| import | 引入一个名为 |
| hostname | 设置主机名 |
| chdir | 更改工作目录为 |
| chmod | 更改文件访问权限 |
| chown | 更改文件所有者和组群 |
| chroot | 更改根目录位置 |
| class_start | 如果它们不在运行状态的话,启动由 |
| class_stop | 如果它们在运行状态的话,停止 |
| domainname | 设置域名 |
| insmod | 在 |
| mkdir | 在 |
| mount | 尝试在指定路径上挂载一个设备 |
| setkey | 目前未定义 |
| setprop | 设置系统属性 |
| setrlinit | 设置一种资源的使用限制。这个概念亦存在于Linux系统中, |
| start | 启动一个服务 |
| stop | 停止一个服务 |
| symlink | 创建一个 |
| sysclk | 设置基准时间,如果当前时间时GMT,这个值是0 |
| trigger | 触发一个事件 |
| write | 打开一个文件,并写入字符串 |
4.3.Services(服务)
1)基本格式:
service[ ]* ... 此service的名字 此service的路径,因为是可执行文件,所以一定有存储路径 启动service所带的参数
2)解释一下:
service是可执行程序,它们在特定选项的约束下会被init程序运行或者重启(service可以在配置中指定是否需要退出时重启,这样当service出现异常或者程序crash时候就有机会复原)
4.4.Options(选项)
| critical | 表示这是一个对设备至关重要的一个服务,如果它在四分钟内退出超过四次,则设备将重启进入恢复模式 |
| disabled | 此服务不会自动启动,而是需要通过显式调用服务名来启动 |
| setenv | 设置环境变量 |
| socket | 创建一个名为/dev/socket/ |
| user | 在启动服务前将用户组切换为 |
| group | 在启动服务前将用户组切换为 |
| oneshot | 只启动一次,当此服务退出时,不要主动去重启它 |
| class | 为该服务指定一个class名,同一个class的所有服务必须同时启动或者停止。默认情况下服务的class名是“default” |
| onrestart | 当此服务重启时,执行某些命令 |



