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>
如字面意思,command1、command2、command3命令在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文件都会被解析为配置文件。但不会解析二级目录。
-
导入
/system/etc/init/hw/init.rc时,或者在初始化启动过程,被ro.boot.init_rc脚本指定。 -
导入
/{system,system_ext,vendor,odm,product}/etc/init/。 -
导入
/{system,vendor,odm}/etc/init/或者在mount_all过程指定的特殊.rc文件。但这个已经过期,在Android Q后该行为已经不允许了。
导入顺序:
/system/etc/init/hw/init.rc/system/etc/init/目录下的文件按字母顺序解析。/system_ext/etc/init,/vendor/etc/init,/odm/etc/init,/product/etc/init也是按2步执行。
上文内容可能存在个人理解偏见,欢迎指正。