Android init.rc解析

1.简述:

Android init.rc文件由用户空间的第一个进程init解析,主要包含五种语句: Actions,Commands,Services,Options,Imports; 在init.rc文件中一条语句通常是占据一行.单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符"",如果在一行的末尾有一个反斜杠,那么是换行折叠符号,应该和下一行合并成一起来处理,这样做主要是为了避免一行的字符太长,与C语言中的含义是一致的。注释是以#号开头。

2. 关键字:

Sections:语句块;以service开头的叫服务,以on开头的叫动作。

Actions: 动作

Services: 服务

Commands:命令

Options:选项

Imports:导入

Trigger:触发器或触发条件

class:类属,即可以为多个service指定一个相同的类属,方便操作同时启动或停止.

3. 语句解析

3.1 Actions

动作由一系列commands组成,动作包含一个trigger,决定了action何时执行,当trigger满足条件时,这个动作将被加到待执行动作队列的尾部,(除非它已经在
队列)

语法:

    on <trigger> [&& <trigger>]*
       <command>
       <command>
       ...
       
eg:

    on boot
       setprop a 0
       setprop b 0
    
    on boot && property:ro.crypto.state=unsupported
       start <service>
3.2 Services

服务是指那些需要在系统初始化时就启动或退出时自动重启的程序

语法:

    service <name> <pathname> [ <argument> ]*
       <option>
       <option>
       ...
       
    eg:
    service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks
3.3 Options

选项是用来修改服务的。它们影响如何及何时运行这个服务.

选项描述
console [<console>]此服务需要一个控制台。可选的第二个参数选择特定的控制台而不是默认控制台
critical这是一项设备关键型服务。 如果它在四分钟内退出四次以上,设备将重启进入恢复模式
disabled服务不会自动运行,必须显式地通过服务器来启动。
setenv <name> <value>设置环境变量
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel>] ] ]在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket.用户名和组名默认为0
enter_namespace <type> <path>输入位于_path_的_ type_类型的命名空间。 _type_设置为“net”时仅支持网络命名空间。 请注意,只能输入给定_type_的一个名称空间
file <path> <type>打开文件路径并将其fd传递给已启动的进程。 _type_必须是 “r”,“w”或“rw”。
user <username>在执行此服务之前先切换用户名。当前默认为root.
group <groupname> [ <groupname>* ]类似于user,切换组名
capabilities <capability> [ <capability>* ]执行此服务时设置功能
setrlimit <resource> <cur> <max>这将给定的rlimit应用于服务
seclabel <seclabel>Change to ‘seclabel’ before exec’ing this service
oneshot当此服务退出时不会自动重启.
class <name> [ <name>* ]给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default
onrestart当服务重启时执行一条指令
writepid <file> [ <file>* ]Write the child’s pid to the given files when it forks
priority <priority>调度服务进程的优先级。 该值必须在范围内 -20到19。
3.4 Trigger

触发器用来描述一个触发条件,当这个触发条件满足时可以执行动作.

触发器描述
boot当init程序执行,并载入/init.conf文件时触发.
<name>=<value>当属性名对应的值设置为指定值时触发.
device-added-<path>当添加设备时触发
device-removed-<path>当设备移除时触发.
service-exited-<name>当指定的服务退出时触发.
3.5 Commands
命令描述
chmod <octal-mode> <path>更改文件访问权限
chown <owner> <group> <path>更改文件的所有者和组属性
class_start <serviceclass>启动指定类属的所有服务,如果服务已经启动,则不再重复启动.
class_stop <serviceclass>停止并禁用指定类属的所有服务
class_reset <serviceclass>如果当前正在运行,则停止指定类的所有服务,而不禁用它们
class_restart <serviceclass>重启指定类的所有服务
copy <src> <dst>复制文件
domainname <name>设置域名
enable <servicename>将已禁用的服务转换为已启用的服务,就像服务未指定已禁用一样
exec [ <seclabel> [ <user> [ <group>* ] ] ] – <command> [ <argument>* ]执行指定路径下的程序,并传递参数
exec_background [ <seclabel> [ <user>[ <group>* ] ] ] – <command> [ <argument>* ]使用给定参数fork和execute命令。 这与 exec 命令的处理方式类似。 区别在于init不会停止执行命令,直到进程退出 exec_background
exec_start <service>启动给定服务并停止处理其他init命令直到它返回
export <name> <value>设置全局环境参数,此参数被设置后对所有进程都有效
hostname <name>这是主机名
ifup <interface>使指定的网络接口"上线",相当激活指定的网络接口
insmod [-f] <path> [<options>]安装模块到指定路径.
load_all_props从/ system,/ vendor 等加载属性。
load_persist_props在解密/ data时加载持久性属性
loglevel <level>设置内核日志级别
mkdir <path> [mode] [owner] [group]用指定参数创建一个目录,在默认情况下,创建的目录读取权限为755.用户名为root,组名为root
mount_all <fstab> [ <path> ]* [–<option>]在给定的fs_mgr-format fstab上调用fs_mgr_mount_all并在指定路径(例如,刚安装的分区上)导入.rc文件,并带有可选选项“early”和“late”。 有关详细信息,请参阅“Init .rc文件”部分
mount <type> <device> <dir> [ <flag>* ] [<options>]类似于linux的mount指令
restart <service>停止并重新启动正在运行的服务,如果服务当前正在重新启动,则不执行任何操作,否则,它只会启动该服务
rm <path>删除文件
rmdir <path>删除文件夹
setprop <name><value>设置属性
setrlimit <resource> <cur> <max>设置资源的rlimit
start <service>如果指定的服务未启动,则启动它
stop <service>如果指定的服务当前正在运行,则停止它
symlink <target> <path>创建一个符号链接
sysclktz <mins_west_of_gmt>设置系统基准时间
trigger <event>Trigger an event. Used to queue an action from another action
umount <path>卸载在该路径上安装的文件系统
write <path> <content>在路径中打开文件,并使用write(2)向其写入一个字符串。 如果该文件不存在,则将创建该文件。 如果确实存在,则会被截断。
3.6 属性(Properties)

Init程序在运行时会更新属性系统的一些属性,提供程序内部正在执行的信息

属性描述
init.svc.<name>当前某个服务的状态(“stopped”, “stopping”, “running”, "restarting)
ro.boottime.initTime after boot in ns (via the CLOCK_BOOTTIME clock) at which the first stage of init started
ro.boottime.init.selinux第一阶段初始化SELinux需要多长时间。
ro.boottime.init.cold_boot_waitinit等待ueventd的冷启动阶段结束的时间。
ro.boottime.<service-name>服务首次启动的时间

以上内容参考aosp/system/core/init/README.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值