Android系统启动之init.rc文件解析过程
文章图片
image.png 目录
第一篇:Android系统启动之bootloader
第二篇:Android系统启动之Init流程(上)
第三篇:Android系统启动之Init流程(下)
第四篇:Android系统启动之init.rc文件解析过程
第五篇:Android系统启动之zyogte进程
第六篇:Android系统启动之zyogte进程java(上)
第七篇:Android系统启动之zyogte进程java(下)
第八篇:Android系统启动之SystemServer
什么是init.rc
Android init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。
rc规则
主要包含了四种类型的语句:
- Action
- Commands
- Services
- Options.
在第一个语句块之前 的commands和options会被忽略.
基本规则如下:
在init.rc文件中一条语句通常是占据一行.关键字
单词之间是通过空格符来相隔的.
如果需要在单词内使用空格,那么得使用转义字符"",如果在一行的末尾有一个反斜杠,那么是换行折叠符号,应该和下一行合并成一起来处理,与C语言中的含义是一致的。
注释是以#号开头。
关键字 | 含义 |
---|---|
token | 计算机语言中的一个单词,就跟英文中的单词几乎相同一人概念. |
Section | 语句块,相当于C语言中大括号内的一个块。一个Section以Service或On开头的语句块.以Service开头的Section叫做服务,而以On开头的叫做动作(Action). |
services | 服务. |
Action | 动作 |
commands | 命令. |
options | 选项. |
trigger | 触发器。或者叫做触发条件. |
class | 类属,即能够为多个service指定一个同样的类属,方便操作同一时候启动或停止. |
注意:当触发器的条件满足时,这个动作会被增加到已被运行的队列尾。假设此动作在队列中已经存在,那么它将不会运行.
一个动作所包括的命令将被依次运行。
on## 触发条件
##执行命令
##可以执行多个命令
触发器(trigger) 在"动作"(action)里面的,on后面跟着的字符串是触发器(trigger),trigger是一个用于匹配某种事件类型的字符串,它将对应的Action的执行。
触发器(trigger)有几种格式:
1、最简单的一种是一个单纯的字符串。比如“on boot”。这种简单的格式可以使用命令"trigger"来触发。常见的格式:
2、还有一种常见的格式是"on property<属性>=<值>"。如果属性值在运行时设成了指定的值,则"块"(action)中的命令列表就会执行。
格式 | 含义 |
---|---|
on early-init | 在初始化早期阶段触发 |
on init | 在初始化阶段触发 |
on late-init | 在初始化晚期阶段触发 |
on boot/charger | 当系统启动/充电时触发 |
on property | 当属性值满足条件时触发 |
命令将在所属事件发生时被一个个地执行.
常见命令:
命令 | 描写叙述 |
---|---|
exec []* | 运行指定路径下的程序,并传递參数. |
export |
设置全局环境參数。此參数被设置后对全部进程都有效. |
ifup |
使指定的网络接口"上线",相当激活指定的网络接口 |
import |
导入一个额外的init配置文件. |
hostname |
设置主机名 |
chdir |
改变工作文件夹. |
chmod |
改变指定文件的读取权限. |
chown |
改变指定文件的拥有都和组名的属性. |
chroot |
改变进行的根文件夹. |
class_start | 启动指定类属的全部服务,假设服务已经启动,则不再反复启动. |
class_stop | 停止指定类属的所胡服务. |
domainname |
设置域名 |
insmod | 安装模块到指定路径. |
mkdir [mode] [owner] [group] | 用指定參数创建一个文件夹,在默认情况下,创建的文件夹读取权限为755.username为root,组名为root. |
mount |
类似于linux的mount指令 |
setkey TBD(To Be Determined), | 待定. |
setprop |
设置属性及相应的值. |
setrlimit |
设置资源的rlimit(资源限制),不懂就百度一下rlimit |
start | 假设指定的服务未启动,则启动它. |
stop | 假设指定的服务当前正在执行。则停止它. |
symlink |
创建一个符号链接. |
sysclktz |
设置系统基准时间. |
trigger |
这名话没有理解,望高手指点. |
write []* | 往指定的文件写字符串. |
service []*
解释一下各个参数:
参数 | 含义 |
---|---|
表示此服务的名称 | |
此服务所在路径因为是可执行文件,所以一定有存储路径。 | |
启动服务所带的参数 | |
对此服务的约束选项 |
选项 | 描述 | |
---|---|---|
critical | 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。 | |
disabled | 服务不会自动运行,必须显式地通过服务器来启动。 | |
setenv | 设置环境变量 | |
socket [ [ ] ] | 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket. | 用户名和组名默认为0 |
user | 在执行此服务之前先切换用户名。当前默认为root. | |
group [ ]* | 类似于user,切换组名 | |
oneshot | 当此服务退出时不会自动重启. | |
class | 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default. | |
onrestart | 当服务重启时执行一条指令, |
service bootanim /system/bin/bootanimation
class core//给服务指定一个类属,这样方便操作多个服务同时启动或停止
user graphics //在执行此服务之前先切换用户名
group graphics audio
disabled//服务不会自动运行
oneshot//当此服务退出时不会自动重启
rc文件实例
# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/libmkdir /dev
mkdir /proc
mkdir /sysmount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /syswrite /proc/cpu/alignment 4ifup lohostname localhost
domainname localhostmount yaffs2 mtd@system /system
mount yaffs2 mtd@userdata /dataimport /system/etc/init.confclass_start defaultservice adbd /sbin/adbd
user adb
group adbservice usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666service runtime /system/bin/runtime
user system
group systemon device-added-/dev/compass
start akmdon device-removed-/dev/compass
stop akmdservice akmd /sbin/akmd
disabled
user akmd
group akmd
rc文件解析 源码路径
system/core/init/init.cpp
中:parser.ParseConfig("/init.rc");
开始解析rc文件.
ParseConfig函数在文件
core/init/init_parser.cpp
140行:bool Parser::ParseConfig(const std::string& path) {
if (is_dir(path.c_str())) {
return ParseConfigDir(path);
}
return ParseConfigFile(path);
}
ParseConfigFile函数:
bool Parser::ParseConfigFile(const std::string& path) {
LOG(INFO) << "Parsing file " << path << "...";
Timer t;
std::string data;
if (!read_file(path, &data)) {
return false;
}data.push_back('\n');
// TODO: fix parse_config.
ParseData(path, data);
for (const auto& sp : section_parsers_) {
sp.second->EndFile(path);
}LOG(VERBOSE) << "(Parsing " << path << " took " << t << ".)";
return true;
}
参考 Android init.rc文件浅析
安卓系统启动--3init.rc解析
init.rc深入学习
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 单点登陆
- Hive常见问题汇总
- android|android studio中ndk的使用
- 操作系统|[译]从内部了解现代浏览器(1)
- 游乐园系统,助力游乐园管理
- 中国MES系统软件随工业化成长