Android初始化语言-init.rc文件

1,088 阅读3分钟

Android初始化语言由五大部分组成:Actions,Commands,Services,Options,和Imports。用来配置和执行Android系统启动过程的一些程序。例如开机动画、Zygote进程的启动。初始化语言由rc文件组织,由init进程进行解析,按照相关规则解析处理。

init.rc的说明文件在目录system/core/init/README.md

Actions

Action是用来操作设备创建和销毁、属性设置,进程重启的命令。当一个或多个trigger触发时,其携带命令就会加入到队列中,会被顺序执行。格式如下:

on <trigger1> [&& <trigger2>]*
   <command1>
   <command2>
   <command3>

如字面意思,command1command2command3命令在trigger1发生时被顺序执行。同时也支持多个trigger,只需要在第一个trigger后通过&&拼接,注意要有空格。

Services

service是在初始化过程启动的程序,而且可以设置在退出时重新启动。

service <name> <pathname> [ <argument> ]*
   <option>
   <option>
   ...

name表示程序的名称,而pathname表示程序执行文件路径,后面可选是程序启动携带的参数。option是用来提供更细粒度的控制程序。

  • class:设置service的class。相同class的service会被一起启动或者停止。若不定义则被视为“default”class。
  • console:将service的输出打印到控制台。
  • critical:设备相关的关键服务。若4分钟内该service重启了4次,则设备将进入recovery模式。
  • description:设置service的描述信息。
  • onboot:在开机时启动service。
  • oneshot:service只启动一次,启动后会自动停止。
  • respawn:service被杀死后会自动重启。
  • seccomp:使用seccomp沙箱限制service的权限。
  • selinux:设置service的SELinux安全策略。
  • user:设置service运行的用户。
  • waitfor:等待其他service启动后再启动此service。

下面是Zygote的rc文件部分内容:

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    priority -20
    user root
    group root readproc reserved_disk
    #创建套接字
    socket zygote stream 660 root system
    socket usap_pool_primary stream 660 root system
    #在zygote重启时,处理额外操作
    onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    #分配高资源和最大性能
    task_profiles ProcessCapacityHigh MaxPerformance
    critical window=${zygote.critical_window.minute:-off} target=zygote-fatal

Imports

import是用来导入其他配置文件,用来扩展当前配置文件。现在init.rc文件将很多不同初始服务或程序拆分成独立的模块,再通过import来导入,进行初始化启动。如bootanimation、zygote。

import pathname

如果pathname是一个文件夹目录,该目录下的rc文件都会被解析为配置文件。但不会解析二级目录。

  1. 导入/system/etc/init/hw/init.rc时,或者在初始化启动过程,被ro.boot.init_rc脚本指定。

  2. 导入/{system,system_ext,vendor,odm,product}/etc/init/

  3. 导入/{system,vendor,odm}/etc/init/ 或者在mount_all过程指定的特殊.rc文件。但这个已经过期,在Android Q后该行为已经不允许了。

导入顺序:

  1. /system/etc/init/hw/init.rc
  2. /system/etc/init/目录下的文件按字母顺序解析。
  3. /system_ext/etc/init, /vendor/etc/init, /odm/etc/init, /product/etc/init也是按2步执行。

上文内容可能存在个人理解偏见,欢迎指正。