rc文件语法是以行尾单位,以空格间隔的语法,以#开始代表注释行。rc文件主要包含Action、Service、command、Options,其中对于Action和Service的名称都是唯一的,对于重复的命名视为无效。
1.Action
Action实际上就是一组命令的名字而已。通过触发器trigger,即以on开头的语句来决定执行相应的service的时机,具体时机如下:
- on early-init ---在初始化早期阶段触发;
- oninit ---在初始化阶段触发;
- on late-init ---在初始化晚期阶段触发;
- on boot/charger ---当系统启动/充电时触发;
- on property:= ---当属性值满足条件时触发;
2.Service
服务以 service开头,由init进程启动,一般运行在init的一个子进程,所以启动service前需要判断对应的可执行文件是否存在。init生成的子进程,定义在rc文件,其中每一个service在启动时会通过fork方式生成子进程。
例如:service zygote /system/bin/app_process64代表的是服务名zygote,服务
执行的实际路径文件为 /system/bin/app_process64。
3.Command
on strigger目标>
<command>
<command>
<command>
例如 init.rc 中启动zygote :
on late-init
# Now we can start zygote for devices with file based encryption
trigger zygote-start
# to start-zygote in device's init.rc to unblock zygote start.
on zygote-start && property:ro.crypto.state=unencrypted
wait_for_prop odsign.verification.done 1
# A/B update verifier that marks a successful boot.
exec_start update_verifier_nonencrypted
start statsd
start netd
start zygote
start zygote_secondary
常用的命令:
- class_start =service_class_ name> ---启动属于同一个class的所有服务;
- start <service name> ---启动指定的服务,若已启动则跳过;
- stop <service_name> ---停止正在运行的服务;
- setprop ---设置属性值;
- mkdir ---创建指定目录;
- symlink <sym_link> ---创建连接到的<symlink>符号链接;
- write ---向文件path中写入字符串;
- exec ---fork并执行,会阳塞init进程直到程序完毕;
- exec_start ---启动给定服务并停止处理其他init命令,直到它返回。该命令的功能类似于exec命令,但使用现有的服务定义来代替exec参数向量;
- exprot ---设定环境变量;
- loglevel ---设置log级别。
4.Options
Options是Service的可选项,与service配合使用。
- disabled ---不随class自动启动,只有根据service名才启动;
- oneshot: ---service退出后不再重启;
- user/group ---设置执行服务的用户/用户组,默认都是root;
- class ---设置所属的类名,当所属类启动/退出时,服务也启动/停止,默认为default;
- onrestart ---当服务重启时执行相应命令;
- socket ---创建名为/dev/socket/的socket;
- critical ---在规定时间内该service不断重启,则系统会重启并进入恢复模式;
- default ---意味着disabled=false, oneshot=false, critical=false。
如:android-12.0.0_r3/system/core/rootdir/init.zygote64.rc
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
socket usap_pool_primary stream 660 root system
onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
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
critical window=${zygote.critical_window.minute:-off} target=zygote-fatal