Android init.rc介绍及其语法

init.rc介绍

init.rc是一个可配置的初始化文件,通常定制厂商可以配置额外的初始化配置,init.%PRODUCT%.rc,如init.qcom.rc。

init.rc加载

init.rc是在/system/core/init/init.cpp中的mian()读取的,按行解析,包含一些用空格隔开的关键字、命令、脚本

static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {
    Parser parser = CreateParser(action_manager, service_list);

    std::string bootscript = GetProperty("ro.boot.init_rc", "");
    if (bootscript.empty()) {
        parser.ParseConfig("/init.rc");
        if (!parser.ParseConfig("/system/etc/init")) {
            late_import_paths.emplace_back("/system/etc/init");
        }
        if (!parser.ParseConfig("/product/etc/init")) {
            late_import_paths.emplace_back("/product/etc/init");
        }
        if (!parser.ParseConfig("/odm/etc/init")) {
            late_import_paths.emplace_back("/odm/etc/init");
        }
        if (!parser.ParseConfig("/vendor/etc/init")) {
            late_import_paths.emplace_back("/vendor/etc/init");
        }
    } else {
        parser.ParseConfig(bootscript);
    }
}
init.rc语法

源码文档介绍Android Init Language:system/core/init/README.md

init.rc只是一个语法文件,就像一个xml文件一样,没有执行顺序的,解析器通过读这个文件获取想要的数据,包括service,action等

init.rc包含4种状态类别:Actions/Commands/Services/Options

当声明一个service或者action的时候,它将隐式声明一个section,它之后跟随的command或者option都将属于这个section,action和service不能重名,否则忽略为error

如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用“”防止关键字被断开,另外注意/在末尾表示换行,#开头的表示注释

  • actions就是在某种条件下触发一系列的命令,通常有一个trigger,形式如:
on <trigger>
	<command>
	<command>
  • service是一个以 service开头,由init进程启动,一般运行于另外一个init子进程的程序服务,启动service前需要判断对应的可执行文件是否存在。init生成的子进程,定义在rc文件,其中每一个service,在启动时会通过fork方式生成子进程。
#name:服务名 pathname:当前服务对应的程序位置 argument:可选参数 option:当前服务设置的选项
service <name> <pathname> [ <argument> ]*
     <option>
     <option>
  • option是service的修饰词,主要包括:
critical  
表示如果服务在4分钟内存在多于4次,则系统重启到recovery mode

disabled  
表示服务不会自动启动,需要手动调用名字启动

setEnv <name> <value>  
设置启动环境变量

socket <name> <type> <permission> [<user> [<group>]] 
开启一个unix域的socket,名字为/dev/socket/<name> , <type>只能是dgram或者stream,<user><group>默认为0

user <username> 
表示将用户切换为<username>,用户名已经定义好了,只能是system/root

group <groupname> 
表示将组切换为<groupname>

oneshot 
表示这个service只启动一次

class <name> 
指定一个要启动的类,这个类中如果有多个service,将会被同时启动。默认的class将会是“default”

onrestart 
在重启时执行一条命令
  • trigger又被细分为事件触发器(event trigger)和属性触发器(property trigger)

事件触发器可由"trigger"命令或初始化过程中通过QueueEventTrigger()触发,通常是一些事先定义的简单字符串,例如:boot,late-init
属性触发器是当指定属性的变量值变成指定值时触发,其格式为property:=*

early-init 
初始化之前触发

init 
初始化时触发

late-init 
初始化之后触发

boot 
当/init.conf加载完毕时

<name>=<value><name>被设置为<value>时

device-added-<path> 
设备<path>被添加时

device-removed-<path> 
设备<path>被移除时

service-exited-<name> 
服务<name>退出时
  • command主要包括:
exec <path> [ <argument> ]*
执行一个<path>指定的程序

export <name> <value>
设置一个全局变量

ifup <interface>
使网络接口<interface>连接

import <filename>
引入其他的配置文件

hostname <name>
设置主机名

chdir <directory>
切换工作目录

chmod <octal-mode> <path>
设置访问权限

chown <owner> <group> <path>
设置用户和组

chroot <directory>
设置根目录

class_start <serviceclass>
启动类中的service

class_stop <serviceclass>
停止类中的service

domainname <name>
设置域名

insmod <path>
安装模块

mkdir <path> [mode] [owner] [group]
创建一个目录,并可以指定权限,用户和组

mount <type> <device> <dir> [ <mountoption> ]*
加载指定设备到目录下
<mountoption> 包括"ro", "rw", "remount", "noatime"

setprop <name> <value>
设置系统属性

setrlimit <resource> <cur> <max>
设置资源访问权限

start <service>
开启服务

stop <service>
停止服务

symlink <target> <path>
创建一个动态链接

sysclktz <mins_west_of_gmt>
设置系统时钟

trigger <event>
触发事件

write <path> <string> [ <string> ]*
向<path>路径的文件写入多个<string>

参考

https://www.cnblogs.com/senior-engineer/p/4848872.html
https://blog.csdn.net/zhonglunshun/article/details/78615980

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值