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 阶段,以及它们与文件系统挂载和文件操作的关系:

  1. early-init:
    • 最早的阶段,在其他任何服务或挂载操作之前执行。
    • 主要用于设置初始的内核参数和一些基本的系统属性。
    • 文件系统尚未挂载,不能进行文件操作。
  2. init:
    • 在 early-init 之后执行。
    • 用于一些基本的系统初始化操作。
    • 大部分文件系统仍未挂载,不建议进行文件操作。
  3. fs:
    • 开始挂载文件系统的阶段。
    • 主要的文件系统(如 /system, /vendor)开始挂载,但可能尚未完全就绪。
    • 不建议在此阶段进行文件操作,因为某些分区可能还未完全挂载。
  4. post-fs:
    • 在基本文件系统挂载完成后执行。
    • 此时,关键的只读分区(如 /system, /vendor)已经挂载完成。
    • 可以开始一些基本的文件操作,特别是涉及系统分区的读取操作。
    • 但是,某些可写分区(如 /data)可能还未挂载或解密。
  5. post-fs-data:
    • 在所有文件系统挂载完成后执行,包括可写分区。
    • /data 分区此时已挂载并可访问。
    • 可以安全地进行大多数文件操作,包括读写操作。
  6. early-boot:
    • 在基本系统服务启动之前执行。
    • 所有文件系统都已挂载,可以进行全面的文件操作。
  7. boot:
    • 系统启动的最后阶段。
    • 所有系统服务开始启动。
    • 可以执行任何文件操作。

关于 post-fs 阶段的文件拷贝:

在 post-fs 阶段,你可以执行一些文件拷贝操作,但需要注意以下几点:

  1. 只读分区(如 /system, /vendor)已经挂载,可以从这些分区读取文件。
  2. 一些可写分区可能还未挂载或准备好,特别是 /data 分区。
  3. 如果你的拷贝操作只涉及已挂载的分区(比如从 /system 到 /vendor),那么在 post-fs 阶段执行是可以的。
  4. 但如果涉及到 /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 文件中相关启动顺序

系统正常开机时

  1. on early-init
  2. on init
  3. on early-fs
  4. on fs
  5. on post-fs
  6. on post-fs-data  //data 分区已挂载
  7. on early-boot
  8. 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 语法

参考如下链接:

Android init.rc 添加自定义服务

 
 refs:
https://blog.csdn.net/tq501501/article/details/118248167
https://blog.csdn.net/feigebangni/article/details/50300063
 
posted @ 2024-09-07 11:10  petercao  阅读(83)  评论(0编辑  收藏  举报