Android系统 init.rc文件详解

在这篇博客中,深入探讨了Android系统中的init.rc文件,这是Android系统启动和运行的关键部分。详细解析了init.rc文件中的命令和动作,包括内置命令,外部命令,属性触发器和事件触发器,并且详细介绍了它们的使用和定义。还讨论了Android 11++中init.rc文件的执行顺序,以及如何根据系统属性和事件来定义和触发动作。这篇博客对于理解和控制Android系统的启动和运行过程非常有帮助。

系列文章
Android系统 init.rc 第一次开机创建文件节点实现和原理分析
Android系统 init.rc开机执行shell脚本
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 init.rc文件详解
Android系统 自定义动态修改init.custom.rc
Android USB系统初始化init.usb.configfs.rc
Android USB系统初始化init.usb.rc

1. init.rc文件概述

1.1 init.rc文件的定义与作用
  • init.rc文件是一个配置文件,由Android初始化语言编写的脚本,主要包含五种类型语句:Action、Command、Service、Option、Import。
  • init.rc文件由Android系统第一个启动的init程序解析,此文件由语句组成,主要包含了四种类型的语句:Action, Commands,Services, Options.
  • init.rc文件是Android系统启动时执行的脚本文件,它负责系统的初始设置,如挂载文件系统,创建目录,设置属性,启动服务等。
1.2 Android启动流程中init.rc的角色
  • Android启动流程可以分为三个主要阶段:第一阶段初始化(first_stage_init),SELinux设置(selinux_setup),第二阶段初始化(second_stage_init)。
  • 第一阶段初始化负责设置最低限度的基本需求用以加载系统其余部分,具体来说,包括“/dev”,“/proc”的挂载,挂载“early mount”分区 (这包括所有包含系统代码的分区,例如system和vendor)。对于有ramdisk的设备,将system.img挂载到“/”。对于没有ramdisk的设备,将system.img挂载到“/system_root”。
  • SELinux设置阶段可选地编译并加载SELinux到系统中,这个阶段主要是加载初始化selinux相关的东西,如sepolicy、seapp_contexts等。
  • 第二阶段初始化是init的主要阶段,将运行并通过init继续引导init.rc脚本。在这个阶段中,init会解析init.rc文件和其他相关的rc文件,并根据其中定义的命令和服务来完成系统启动。例如,init会导入init.super.rc文件 (我在rk3568没看到这个文件),用于挂载super分区和动态分区;导入init.hardware.rc文件,用于启动硬件相关的服务;导入init.zygote64_32.rc文件,用于启动Zygote进程和应用程序框架等。

2. init.rc文件结构和语法

2.1 init.rc文件的基本结构
  • init.rc文件由多个部分组成,每个部分以一个关键字开头,并用花括号括起来。例如:
service <name> <pathname> [ <argument> ]*
{
    <option>
    <option>
    ...
}
  • 关键字有以下几种:service, action, onrestart, import, writepid。
  • service表示定义一个服务,action表示定义一个动作,onrestart表示定义一个服务重启时执行的命令,import表示导入其他rc文件,writepid表示将服务进程的PID写入到指定文件。
2.2 init.rc文件的语法规则
  • init.rc文件中的每一行都是一个语句或者一个注释。注释以#开头,并且只能单独占一行。
  • 语句的格式为:关键字 参数1 参数2 … 参数n
  • 参数之间用空格或者制表符分隔,不能用逗号或者其他符号。
  • 参数可以是字符串,数字,变量或者表达式。字符串必须用双引号括起来,数字可以是十进制或者十六进制(以0x开头)。变量以$开头,可以是系统属性或者环境变量。表达式可以是比较运算符(==, !=, <, >, <=, >=)或者逻辑运算符(&&, ||, !)组合的布尔值。
  • 语句可以跨越多行,但是必须在每行的末尾加上反斜杠(\)表示续行。

3. init.rc文件中的命令和动作

3.1 常用命令详解

命令是init.rc文件中的基本元素,它们用于执行一些具体的操作,如挂载文件系统,设置属性,启动服务等。命令有以下几种类型:

内置命令

这些命令是init进程直接实现的,它们通常用于执行一些基本的系统操作,如挂载文件系统,设置系统属性,启动和停止服务等。这些命令是Android系统启动和运行的基础,它们在系统的整个生命周期中都可能被使用。

命令示例说明参数
setpropsetprop ro.debuggable 1设置一个系统属性的值是属性名,是属性值
getpropgetprop ro.bootmode获取一个系统属性的值是属性名
startstart surfaceflinger启动一个服务进程是服务名
stopstop surfaceflinger停止一个服务进程是服务名
restartrestart media重启一个服务进程是服务名
class_startclass_start core启动一类服务进程是服务类别
class_stopclass_stop core停止一类服务进程是服务类别
class_resetclass_reset core重置一类服务进程的状态是服务类别
triggertrigger init触发一个触发器段落的执行<trigger_name>是触发器名
writewrite /sys/class/leds/lcd-backlight/brightness 255向一个文件写入一个值是文件路径,是写入值
copycopy /system/etc/init/hw/init.{ro.hardware}.rc /data/misc/wifi/wpa_supplicant.conf复制一个文件到另一个文件<src_path>是源文件路径,<dst_path>是目标文件路径
symlinksymlink /system/bin/linker /system/bin/linker64创建一个软链接到另一个文件<target_path>是目标文件路径,<link_path>是软链接路径
chmodchmod 0660 /data/misc/wifi/wpa_supplicant.conf修改一个或多个文件的权限模式是八进制数表示的权限位,<path…>是文件路径列表
chownchown system system /data/misc/wifi/wpa_supplicant.conf改变文件或目录的所有者和组.是所有者和组,是文件或目录路径
mountmount ext4 /dev/block/mmcblk0p1 /system挂载文件系统文件系统类型,设备,挂载点
umountumount /system卸载文件系统挂载点
外部命令

这些命令是由系统提供的可执行文件实现的,它们通常用于执行一些更复杂的操作,如创建和删除目录,修改文件权限等。这些命令通常在系统启动时被执行,用于设置系统的初始状态。

命令示例说明参数
mkdirmkdir /data/misc/wifi 0770 wifi wifi创建目录路径,权限,所有者,组
rmdirrmdir /data/misc/wifi删除目录路径
rmrm /data/misc/wifi/wpa_supplicant.conf删除文件文件路径
execexec – /system/bin/sh -c “mkdir /data/app-private”执行一个命令,通常用于执行一些复杂的shell命令命令行
属性触发器

这些命令是由系统属性的变化触发的,它们通常用于响应系统状态的变化,如电池电量低,网络连接变化等。这些命令可以让我们在系统属性变化时执行一些特定的操作,以适应新的系统状态。

命令示例说明参数
on property:=on property:ro.bootmode=charger当属性的值变为时,执行后面的命令是属性名,是属性值
事件触发器

这些命令是由系统事件触发的,它们通常用于响应系统的一些特定事件,如系统启动,设备插入等。这些命令可以让我们在特定的系统事件发生时执行一些特定的操作,以响应这些事件。

命令示例说明参数
onon boot当事件发生时,执行后面的命令是事件名

以上是一些常见的命令,但并不是全部,Android init语言的完整语法可以在Android源代码的system/core/init/README.md文件中找到。

3.2 常用动作详解
  • 动作是由一组命令组成的,它们在满足某个触发条件时执行。动作的格式为:
on <trigger>
    <command>
    <command>
    ...
  • 触发条件可以是系统属性或者系统事件。系统属性的格式为:property:<name>=<value>,表示当属性<name>的值变为<value>时触发。系统事件的格式为:<event>,表示当<event>事件发生时触发。常用的系统事件有以下几种:
顺序阶段描述
1on early-init在系统启动的早期阶段,此时只有根文件系统是可写的,其他如/system/data等都是只读的。
2on init在系统初始化阶段,此时还不能访问/system/data等目录。
3on early-fs在文件系统准备好之后的早期阶段,此时可以访问/system等目录,但/data等目录可能还是只读的。
4on fs在文件系统准备好之后,此时可以访问/system等目录,但/data等目录可能还是只读的。
5on post-fs在文件系统挂载之后,此时可以访问大部分目录,但/data等目录可能还是只读的。
6on post-fs-data/data等目录准备好之后,此时可以访问所有目录。
7on early-boot在系统启动的早期阶段,此时可以访问所有目录,并且所有服务都已经启动。
8on boot在系统启动完成之后,此时可以访问所有目录,并且所有服务都已经启动。
9on post-boot在系统启动完成后的后期阶段,此时可以访问所有目录,并且所有服务都已经启动,通常用于启动一些非关键服务。
10on property:<name>=<value>当系统属性<name>的值变为<value>时,执行后面的命令。
11on <event><event>事件发生时,执行后面的命令。常见的事件有boot(系统启动完成)、fs(文件系统已经挂载)、post-fs-data/data分区挂载后执行)、charger(充电模式启动)等。
  • 动作中的命令可以是内置命令,外部命令,或者其他动作的触发器。例如:
on boot
    # Start the low-level logging daemon
    start logd
    # Start the kernel logging daemon
    start klogd
    # Trigger late init
    trigger late-init

image.png

  • 动作可以嵌套定义,即一个动作中可以包含另一个动作的定义。例如:
on property:sys.boot_completed=1
    # Action to run upon boot completion.
    on boot_complete
        trigger boot_complete

image.png

4. init.rc文件编写

4.1. 编写自己的init.rc文件

算了 尝试了几种方法都加不成功 , 后面再补充…


希望对你有所帮助。如果你有任何问题或建议,欢迎留言讨论。谢谢!

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
init.rc是一个配置文件,用于规定Android系统init进程的行为和动作。init进程是由Android的Linux内核启动的第一个进程,它的PID永远是1,并且是不会死亡的。init进程启动后会fork出其他重要的系统进程,如zygote进程,负责拉起所有应用程序的进程。init.rc文件中包含两种声明,即on和service。on声明定义了init服务的行为,而service声明定义了服务及其相关行为。init.rc文件中的服务声明可以让服务执行启动、停止等动作。通过修改init.rc文件,可以实现开机启动进程等功能。\[1\]\[3\]在具体的工程中,init.rc文件的路径可能会有所不同,可以根据实际情况查找相应的目录。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [init.rc介绍](https://blog.csdn.net/ll148305879/article/details/91963302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本](https://blog.csdn.net/weixin_53620063/article/details/123797135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一歲抬頭

点赞1元,收藏免费,打赏随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值