init.rc详解

init.rc详解,第1张

init.rc详解 一、什么是init.rc?

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就是响应某个事件的过程,即当所描述的事件发生的时候,依次执行command1、command2...

从源码实现上看,当事件发生后,系统会对init.rc中各进行匹配,只要发现符合条件的Action,就会把它加入“命令执行队列”的尾部(如果已经存在了就不加了),然后系统再对这些命令按顺序执行。

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并执行一个程序,其路径为,这条命令将阻塞直到该程序启动完成,因此它有可能造成init程序在某个节点不停地等待export设置某个环境变量的值为,这是对全局有效的,即其后所有进程都将继承这个变量ifup使网络接口成功连接import引入一个名为的文件hostname设置主机名chdir更改工作目录为chmod更改文件访问权限chown更改文件所有者和组群chroot更改根目录位置class_start如果它们不在运行状态的话,启动由类名指定的所有相关服务class_stop如果它们在运行状态的话,停止domainname设置域名insmod在路径上安装一个模块mkdir[mode][owner][group]在路径上新建一个目录mount[]*尝试在指定路径上挂载一个设备setkey目前未定义setprop设置系统属性的值为setrlinit设置一种资源的使用限制。这个概念亦存在于Linux系统中,表示软限制,表示硬限制start启动一个服务stop停止一个服务symlink创建一个路径的软链接,目标为sysclk设置基准时间,如果当前时间时GMT,这个值是0trigger触发一个事件write[]*打开一个文件,并写入字符串

4.3.Services(服务)

1)基本格式:

service  [  ]*
    
    
    ...

此service的名字
此service的路径,因为是可执行文件,所以一定有存储路径
启动service所带的参数

2)解释一下:

service是可执行程序,它们在特定选项的约束下会被init程序运行或者重启(service可以在配置中指定是否需要退出时重启,这样当service出现异常或者程序crash时候就有机会复原)

4.4.Options(选项)

critical表示这是一个对设备至关重要的一个服务,如果它在四分钟内退出超过四次,则设备将重启进入恢复模式disabled此服务不会自动启动,而是需要通过显式调用服务名来启动setenv设置环境变量为某个值socket[ []]创建一个名为/dev/socket/的unix domain socket,然后将它的fd值传给启动它的进程,有效的值包括dgram,stream和seqacket,而user和group的默认值是0user在启动服务前将用户组切换为,默认情况下用户都是rootgroup[]*在启动服务前将用户组切换为oneshot只启动一次,当此服务退出时,不要主动去重启它class为该服务指定一个class名,同一个class的所有服务必须同时启动或者停止。默认情况下服务的class名是“default”onrestart当此服务重启时,执行某些命令

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5660772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存