Android init.rc
init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本
https://blog.csdn.net/weixin_53620063/article/details/123797135
Android .rc执行顺序:
on early-init
on init
on late-init
on early-fs
on fs
on post-fs
on late-fs
class_start early_hal
on post-fs-data
load_persist_props_action
zygote-start
firmware_mounts_complete
on early-boot
on boot
class_start hal
class_start core
on trigger_xxxx
class_start main
class_start late_start
on trigger_restart_framework
class_start_post_data hal
class_start_post_data core
class_start main
class_start late_start
on trigger_shutdown_framework
class_reset late_start
class_reset main
class_reset_post_data core
class_reset_post_data hal
Android init.rc 中的各个阶段对应了系统启动过程中的不同时期。让我详细解释一下各个主要阶段,特别是 post-fs 阶段,以及它们与文件系统挂载和文件操作的关系:
- early-init:
- 最早的阶段,在其他任何服务或挂载操作之前执行。
- 主要用于设置初始的内核参数和一些基本的系统属性。
- 文件系统尚未挂载,不能进行文件操作。
- init:
- 在 early-init 之后执行。
- 用于一些基本的系统初始化操作。
- 大部分文件系统仍未挂载,不建议进行文件操作。
- fs:
- 开始挂载文件系统的阶段。
- 主要的文件系统(如 /system, /vendor)开始挂载,但可能尚未完全就绪。
- 不建议在此阶段进行文件操作,因为某些分区可能还未完全挂载。
- post-fs:
- 在基本文件系统挂载完成后执行。
- 此时,关键的只读分区(如 /system, /vendor)已经挂载完成。
- 可以开始一些基本的文件操作,特别是涉及系统分区的读取操作。
- 但是,某些可写分区(如 /data)可能还未挂载或解密。
- post-fs-data:
- 在所有文件系统挂载完成后执行,包括可写分区。
- /data 分区此时已挂载并可访问。
- 可以安全地进行大多数文件操作,包括读写操作。
- early-boot:
- 在基本系统服务启动之前执行。
- 所有文件系统都已挂载,可以进行全面的文件操作。
- boot:
- 系统启动的最后阶段。
- 所有系统服务开始启动。
- 可以执行任何文件操作。
关于 post-fs 阶段的文件拷贝:
在 post-fs 阶段,你可以执行一些文件拷贝操作,但需要注意以下几点:
- 只读分区(如 /system, /vendor)已经挂载,可以从这些分区读取文件。
- 一些可写分区可能还未挂载或准备好,特别是 /data 分区。
- 如果你的拷贝操作只涉及已挂载的分区(比如从 /system 到 /vendor),那么在 post-fs 阶段执行是可以的。
- 但如果涉及到 /data 或其他可能还未准备好的分区,最好等到 post-fs-data 阶段。
建议:
- 如果你的拷贝操作不紧急,最安全的做法是在 post-fs-data 或 early-boot 阶段执行。
- 如果必须在 post-fs 阶段执行,确保源和目标路径都在已知已挂载的分区上。
- 总是添加错误检查,以防文件系统未完全准备好。
例如,在 post-fs 阶段的安全拷贝操作:
on post-fs # 确保目标目录存在 mkdir /vendor/my_dir 0755 system system # 执行拷贝操作 copy /system/etc/my_file /vendor/my_dir/my_file chmod 0644 /vendor/my_dir/my_file chown system system /vendor/my_dir/my_file
这个例子假设 /system 和 /vendor 分区在 post-fs 阶段已经挂载并可访问。
一、init.rc 文件中相关启动顺序
系统正常开机时
- on early-init
- on init
- on early-fs
- on fs
- on post-fs
- on post-fs-data //data 分区已挂载
- on early-boot
- on boot
恢复出厂设置启动顺序
on property:vold.decrypt=trigger_shutdown_framework
on property:vold.decrypt=trigger_restart_min_framework // 启动最小系统
on property:vold.decrypt=trigger_reset_main // 输入安全密码时
on property:vold.decrypt=trigger_post_fs_data // data 挂载
on property:vold.decrypt=trigger_restart_framework // 系统正常启动
二、init 文件路径
系统 init rc 文件比较多,在根目录和 vendor/etc/init/hw 目录下都有。根目录下的 rc 文件权限更高些,当需要 mkdir 创建 /data 目录下文件夹或者是 setprop sys.* 之类属性值。最好都是在根目录下的 rc 文件中执行。
三、init.rc 语法
参考如下链接: