转载:https://blog.youkuaiyun.com/feigebangni/article/details/50300063
init是Android中linux的第一个用户级进程,主要是解析init.rc脚本。
init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:
1)设置一些环境变量
2)创建system、sdcard、data、cache等目录
3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)设置一些文件的用户群组、权限
5)设置一些线程参数
6)设置TCP缓存大小
init脚本的关键字(如mkdir,chmod,service等等)可以参考init进程的
system/core/init/keyword.h文件。
init.rc的使用方法,可以参考说明文件system/core/init/readme.txt
如果想要修改启动过程只需要修改init.c(system/core/init)或者init.rc里的内容即可.
initrc脚本的4种类型">init.rc脚本的4种类型
- Action(动作)
- Commands(命令)
- Services(服务)
- Options(选项)
Action
格式:
on < trigger > ##触发条件
< command1 > ## 执行命令
< command2 > ##可以执行多个命令
< command3 >
…
比如系统源码中的:
on property:sys.boot_from_charger_mode=1
class_stop charger
trigger late-init
当相应的事件发生时,系统会对init.rc中的各进行匹配,只要发现符合条件的Action,就会把它加入”命令执行队列”的尾部,(除非这个Action在队列中已经存在)。然后系统在对这些命令按顺序执行。
Commands
trigger
Trigger | Description |
---|---|
bott | 这是init程序启动后出发的第一个事件 |
< name > = < value > | 当属性< name >满足特定< value >时触发 |
device-added-< path> | 当设备节点添加/删除时触发此事件 |
service-exited-< name > | 当指定的服务< name >存在时触发 |
Commands
Command | Description |
---|---|
exec < path > [< argument >]* | Fork并执行一个程序,其路径为< path >,这条命令将阻塞直到该程序启动完成,因此他有可能造成init程序在某个点不停的等待。 |
export < name >< value > | 设置某个环境变量< name >的值为< value >,这是对全局有效的,即其后的所有进程都将继承这个变量。 |
ifup < interface > | 使网络接口< interface >成功连接。 |
import < filename > | 解析另外一个配置文件,名为< filename >,以扩展当前配置。 |
hostname < name > | 设置主机名为< name > |
chdir < directory > | 更改工作目录为< directory > |
chmod < octal-modc > | 更改文件访问权限 |
chown < owner >< group >< path > | 更改文件所有者和组群 |
chroot < directory > | 更改根目录位置 |
class_start < serviceclass > | 启动由< servicesclass >类名指定的所有相关服务,如果他们不存在运行状态的话 |
class_stop < serviceclass > | 停止所有由< serviceclass >指定的服务,如果他们当前正在运行的话 |
domainname < name > | 设置域名 |
insmod < path > | 在< path >路径上安装一个模块 |
mkdir < path >[mode][owner][group] | 在< path >上新建一个目录 |
mount < type >< device >< dir >[mountoption] | 尝试在指定路径上挂载一个设备 |
setkey | 目前没有定义 |
setprop< name >< value > | 设置系统属性< name >的值< value > |
start < service > | 这个命令将启动一个服务,如果他没有处于运行状态的话 |
stop < service > | 这个命令将启动一个服务,如果他没有处于运行状态的话 |
symlink < target >< path > | 创建一个< path >路径的连接,目标为< target > |
sysclktz | 设置基准时间,如果当前时间是GMT,这个值为0 |
trigger < event > | 触发一个事件 |
write < path >< string >[ < string >]* | 打开一个文件,并写入一个或多个字符串 |
Services
在特定选项的约束下被init程序运行或者重启.
格式:
service < name >< pathname > [ < argument >]*
< option >
< option >
…
参数解释:
- name 表示此service的名称
- pathname 此service所在路径。
- argument 启动service所带的参数
- option 对此service的约束选项。
options
Services中的可用选项:
option | Description |
---|---|
critical | 表明这个对设备至关重要的服务,如果他在四分钟内退出超过4次,则设备将重启进入恢复模式 |
disable | 此服务不会自动启动,而是需要通过显示调用服务名来启动 |
setenv < name >< value > | 设置环境变量< name >为某个值< value > |
socket < name >< type >< perm >[< user >[ < group >]] | 创建一个名为/dev/socket/< name >的Unix domain socket,然后将他的fd值传给启动它的进程,有效的< type >值包括dgram,steam和seqpacket.而user和group的默认值是0 |
user < username > | 在启动服务前将用户切换至< username >,默认情况下用户都是root |
group < groupname >[< groupname >] | 在启动服务将用户组切换至< groupname > |
oneshot | 当此服务退出时,不要主动去重启他 |
class < name > | 为该服务指定一个class名,同一个class的所有服务必须同时自动或者停止,默认情况下服务的class名是”default” |
onrestart | 当此服务重启时,执行某些命令 |