Android 10 启动分析之init语法详解
目录
- 正文
- Actions
- Services
- Options
- Triggers
- Commands
- Imports
正文
init.rc脚本包含5种类型,Action(动作),Commands(命令), Services(服务),Options(选项), Imports(导入)。
以上这些都是基于“行”来解析的,并且用空格隔开关键字。
如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用""防止关键字被断开,另外需要注意/在末尾表示换行。
#开头表示注释。
可以使用语法 ${propertiesty.name}展开系统属性。这也适用于需要连接的上下文,如import /init.Recovery.${ro.hardware}.rc
。
当声明一个service或者action的时候,它将隐式声明一个section,它之后跟随的command或者option都将属于这个section。
Service的名称要保持唯一性。如果使用与现有Service相同的名称定义了第二个Service,则将忽略该Service并记录错误消息。
Actions
Action 指的是在某种条件下触发一系列的命令,通常有一个Trigger,用于确定何时执行操作。当与Action的Trigger匹配的事件发生时,该Action将被添加到待执行队列的尾部(除非它已经在队列上)。
Action的形式如下所示:
on <trigger> [&& <trigger>]* <command> <command> <command>
Services
Services在特定选项的约束下被init程序运行或者重启,Service的格式如下所示:
service <name> <pathname> [ <argument> ]* <option> <option> ...
参数解释:
- name 表示此service的名称
- pathname 此service所在路径。
- argument 启动service所带的参数
- option 对此service的约束选项。
Options
Options是Services的修饰符。它们影响init运行Services的方式和时机。
class <name> [ <name>\* ]
为该服务指定一个class名,同一个class的所有服务必须同时自动或者停止,默认情况下服务的class名是"default" 。
console [<console>]
这个Service需要一个控制台。可选的第二个参数选择一个特定的控制台,而不是默认的。可以通过设置androidboot.sole
内核参数来更改默认的/dev/console
。在所有情况下,都应该省略前面的/dev/
,因此/dev/tty0
将被写作console tty0
。
critical
表明这个Service对设备至关重要,如果Service在四分钟内退出超过4次,则设备将重启进入恢复模式。
disabled
此Service不会自动启动,需要通过显示调用Service名称来启动。
file <path> <type>
打开文件路径并将其FD传递给启动进程。类型必须是“r”、“w”或“RW”。
group <groupname> [ <groupname>\* ]
在启动服务将用户组切换至<groupname>
keycodes <keycode> [ <keycode>\* ]
设置将触发此服务的Keycodes。如果同时按下与传递的Keycodes对应的所有键,则服务将启动。这通常用于启动bugreport服务。
oneshot
当此Service退出时,不要主动去重启它。
onrestart
在重启时执行一条命令。
oom_score_adjust <value>
将子程序的/proc/Self/oom_Score_adj
设置为指定的值,该值必须在-1000到1000之间。
override
指示此Service用于覆盖先前定义的具有相同名称的Service。
priority <priority>
Service进程的调度优先级。此值必须在-20到19之间。默认优先级为0。
restart_period <seconds>
如果一个non-oneshot Service退出,它将在其启动时间的基础上加上这段时间后再重新启动,默认5s。对于打算定期运行的服务,可以增加此值。例如,它可以设置为3600表示服务应该每小时运行一次,或者86400表示服务应该每天运行。
setenv <name> <value>
设置启动环境变量。
shutdown <shutdown_behavior>
设置Service进程的关闭行为。如果未指定此操作,则通过SIGTERM和SIGKILL关闭Service进程。在关机期间,shutdown_behavior为“critical”的Service在shutdown超时之前不会被关闭。当shutdown超时时,即使标记为“shutdown critical”的Service也将被关闭。当执行shut down操作时,标记为“shutdown critical”的服务如果没有运行,它将被启动。
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
创建一个名为/dev/Socket/name的Unix域套接字,并将其FD传递给启动进程。类型必须是“dgram”、“stream”或“seqPacket”。用户和组默认为0。“secLabel”是套接字的SELinux安全上下文。
user <username>
表示将用户切换为<username>,当前默认为root。
Triggers
Triggers是可用于匹配某些类型的事件,并触发一个Action的字符串。
Triggers被细分为Event triggers
和Property triggers
。
Event triggers
是由init可执行文件中的trigger
命令或QueueEventTrigger()
函数触发的字符串。它们的形式是一个简单的字符串,比如boot
或late-init
。
Property triggers
是命名属性将值更改为给定的新值或命名属性将值更改为任何新值时触发的字符串。它们分别以Property:<name><value>
和Property:<name>=*
的形式出现。Property triggers
还会在init的初始启动阶段被触发。
一个Action可以有多个Property triggers
,但可能只有一个Event triggers
。
例如:
onboot&&properties:a=b
定义了一个只有当boot
Event triggers
发生并且属性a等于b时才执行的Action
。
on property:a=b && property:c=d
定义了一个执行三次的Action
:
- 在 initial boot 期间, 如果 property a=b 且 property c=d。
- 当property c已经等于d时,property a转换为b值。
- 当property a已经等于b时,property c转换为d值。
Commands
bootchart [start|stop]
start or stop bootchart,bootchart是用于记录开机时进程启动时间的工具。
chmod <octal-mode> <path>
更改文件访问权限。
chown <owner> <group> <path>
更改文件所有者和组。
class_start <serviceclass>
如果指定类的Service尚未运行,则启动它们。
class_stop <serviceclass>
如果指定类的Service正在运行,则停止并禁用它们。
class_reset <serviceclass>
如果指定类的Service正在运行,则停止它们,但是不禁用它们。它们可以使用class_start重新启动。
class_restart <serviceclass>
重新启动指定类的Service。
copy <src> <dst>
复制一份文件。通常用于二进制/大数据文件。
enable <servicename>
将disable的Service转换为enable的Service。如果Service应该被执行,它将立即启动。
exec [ <seclabel> [ <user> [ <group>\* ] ] ] -- <command> [ <argument>\* ]
用给定的参数fork并执行command。在这个command完成之前,不会运行其他命令。SecLabel可以用-来表示默认值。
mkdir <path> [mode] [owner] [group]
在PATH上创建一个目录,默认权限为755,并由root用户和root组拥有。
restart <service>
重启正在运行的Service。
start <service>
如果Service尚未运行,则启动该Service。请注意,这是异步的操作。
trigger <event>
触发一个Event。
write <path> <content>
打开路径为PATH的文件,并使用write()向其写入一个字符串。如果该文件不存在,则将创建该文件。
Imports
import <path>
解析init配置文件,扩展当前配置。如果PATH是一个目录,则该目录中的每个文件都被解析为一个配置文件,但它不是递归操作,嵌套目录不会被解析。
以上就是Android 10 启动分析之init语法详解的详细内容,更多关于Android 10 启动init语法的资料请关注我们其它相关文章!