目录
  1. 1. 简介
  2. 2. init.rc 语法介绍
    1. 2.1. Actions:一组被命名的命令序列
    2. 2.2. Command
    3. 2.3. Services:需要在系统初始化时就启动或退出时自动重启的在后台执行的程序
    4. 2.4. Options
    5. 2.5. 其他补充
重拾Android-【吃透源码系列】之Android系统启动(二)rc文件语法

init.rc 是由许多的 Actions(行动) 、 Services(服务) 等类型组成。在这语法里规定,所有类型的语句都是基于行的,即 一个语句占据一行,并且各个关键字被空格分开。

简介

目前 Linux 有很多通讯机制可以在 用户空间内核空间 之间交互,例如 设备驱动文件(位于/dev目录中)、内存文件(/proc、/sys 目录等等)。众所周知,在 Linux 中一切皆文件,即一切都是以文件的形式存在的。例如:一个设备通常与一个或多个设备文件对应。这些与内核空间交互的文件都在用户空间,所以在Linux内核挂载完成,首先需要的就是建立这些文件所在的目录。而完成这些工作的程序就是本文要介绍的 init。

Init 是一个命令行程序,其主要工作之一就是建立这些与内核空间交互的文件所在的目录。当 Linux 内核加载完成,第一个要做的事就是调用 Init 程序,也就是说 init 是用户空间执行的第一个程序。

我们必须知道,Init 并不是由一个源文件组成的,而是由一系列源代码文件组成的目标文件链接。因此 init.rc 归根结底 只是一个语法文件,并不是程序。真正的入口其实是上面提到的 system/core/init/init.c

init.rc 文件有两个,分别位于:

./system/core/rootdir/init.rc

./bootable/recovery/etc/init.rc

这两个 init.rc 使用场景是不一样的,一个是为了刷机,也就是进入recorvery模式,而另一个则是正常启动才用得到;下面重点分析的是第一个,也是init.c关联的那个;

在初始化语言里,主要包含这四种类型的声明:
>

Actions(行动)Commands(命令)Services(服务)Options(选项)

对于 init.rc

  • 它是一个可配置的初始化文件,通常定制厂商可以配置额外的初始化配置,init.%PRODUCT%.rc
  • 同时init.rc是在 $GINGERBREAD/system/core/init/init.c 中读取的,它基于“行”,包含一些用空格隔开的关键字(它属于特殊字符)
  • 除此之外,# 开头的表示注释
  • 如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用“”防止关键字被断开,另外注意/在末尾表示换行
  • 动作(Actions)和服务(Services)语句隐含表示一个新的段落(section)的开始。
  • 所有的命令(commands)和选项(options)归属于上方最近的一个段落。
  • 在第一个段落之前的指令(commands)和选项(options)是无效的。在服务(Services)之后的命令也是无效的。
  • action 和 service 不能重名,否则忽略为 error
  • import 语句导入其他的rc文件,例如 import /init.usb.rc 导入根目录下的 init.usb.rc 文件。

init.rc 语法介绍

Actions:一组被命名的命令序列

动作(Actions)就是在某种条件下触发一系列的命令,通常有一个trigger,如果匹配触发条件,则 Actions 将会被添加到预备执行的队列的尾部。

形式如下:

on <trigger>
    <command>
    <command>

trigger主要包括:

  • boot 发生在 init 启动时,当 /init.conf 加载完毕时触发

  • \=\ 当\被设置为\时触发,例如 on property:sys.sensors=1 表示当环境变量sys.sensors被设置为1的时候触发。

  • device-added-\/device-removed-\ 当一个device node被添加/删除时。

  • service-exited-\ 当某个服务退出时触发。

Command

主要包括:

  • exec \ [ \ ] 执行指定路径下的程序,并传递参数.

  • export \ \ 设置全局环境参数,此参数被设置后对所有进程都有效.

  • ifup \ 使指定的网络接口”上线”,相当激活指定的网络接口

  • hostname \ 设置主机名

  • chdir \ 改变工作目录.

  • chmod \ \ 改变指定文件的读取权限.

  • chown \ \ \ 改变指定文件的拥有都和组名的属性.

  • chroot \ 改变进行的根目录.

  • class_start \ 启动指定类属的所有服务,如果服务已经启动,则不再重复启动.

  • class_stop \ 停止指定类属的所有服务.

  • domainname \ 设置域名

  • insmod \ [ \ ] 安装指定路径的模块,以及指定参数.

  • mkdir \ [mode] [owner] [group] 用指定参数创建一个目录,在默认情况下,创建的目录读取权限为755.用户名为root,组名为root.

  • mount \ \ \ [ \ ] 类似于linux的mount指令

  • setprop \ \ 设置属性及对应的值.

  • setrlimit \ \ \ 设置资源的rlimit(资源限制),不懂就百度一下rlimit

  • start \ 如果指定的服务未启动,则启动它. 例如”start ueventd “ ueventd 是服务名.

  • stop \ 如果指定的服务当前正在运行,则停止它.

  • symlink \ \ 创建一个符号链接.

  • sysclktz \ 设置系统基准时间.

  • trigger \ 启动某个触发条件,例如trigger firmware_mounts_complete,那么on firmware_mounts_complete段的动作将会执行

  • write \ \ [ \ ] 往指定的文件写字符串.

Services:需要在系统初始化时就启动或退出时自动重启的在后台执行的程序

形式如下:

service <name> <pathname> [ <argument> ]
    <option>  
    <option> 

说明:name 可以随便定义一个有意义的名字,但是这个名字在rc文件里面要是唯一的,如果有重名的,那么之后的将会忽略掉。
pathname 该应用程序在系统中的绝对路径 argument是传给该应用程序的参数。

Options

主要包括:

  • critical 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。

  • disabled 该服务不能通过启动一类服务来启动,例如 即使该服务有定义option “class core” 也不能用class_start core来启动,只能以单独的名字来启动 start name.

  • setenv \ \ 设置环境变量

  • socket \ \ \ [ \ [ \ ] ]/dev/socket/ 下创建一个 unix domain 的 socket,并传递创建的文件描述符fd给服务进程.其中 type 必须为 dgramstream,seqpacket. 用户名和组名默认为0

  • user \ 在执行此服务之前先切换用户名。当前默认为root.

  • group \ [ \ ] 类似于user,切换组名 默认为root

  • oneshot 当此服务退出时不会自动重启. 如果没有这个选项,只运行一次。

  • class \ 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default.

  • onrestart 当服务重启时执行一条指令, 例如 “onrestart exec /system/bin/myapp” 则表示在服务重新启动的时候执行 /system/bin/myapp 这个应用。

其他补充

参考链接

本说明文件位于Android9.0源码 system/core/init/README.md

打赏
  • 微信
  • 支付宝

评论