本文将介绍Android Init Language 相关的一些知识。
什么是Android Init Language
Android Init Language 是Android用来进行服务初始化的一种脚本语言,这些脚本的后缀名均为.rc,这种脚本主要的作用是用来顺序启动Android的一系列服务
这是Android Init Language的官方文档:
语法结构
Android Init Language 语法结构十分简单,大致如下:
xml
import <path>
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
on <trigger> [&& <trigger>]*
<command>
<command>
<command>
一个rc文件,由5个部分组成,Actions,Commands,,Services,Options,和 Imports。
阅读RC文件
接下来我们将讲解如何阅读一个rc文件,首先在/system/core/rootdir
下面,可以看到多个rc文件:
打开init.zygote64.rc
,我们可以看到以下的文件内容:
perl
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
onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
onrestart write /sys/power/state on
# NOTE: If the wakelock name here is changed, then also
# update it in SystemSuspend.cpp
onrestart write /sys/power/wake_lock zygote_kwl
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart media.tuner
onrestart restart netd
onrestart restart wificond
task_profiles ProcessCapacityHigh MaxPerformance
critical window=${zygote.critical_window.minute:-off} target=zygote-fatal
这个时候我们可以打开Android Init Language 的Readme文件,来一项项查找这个文件的每条指令代表什么。
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
从文档中我们可以看出,这代表着注册一个名字为zygote的service,并且指定此服务的执行文件路径,以及执行此文件时所带的参数:
class main
这是服务的类名,相当于这个服务的分组,默认为default
,这些分组的服务可以整组的启动或停止:
priority -20
服务的优先级,取值范围为-20到19,默认为0:
user root
执行此服务的之前切换的用户,默认为root
:
group root readproc reserved_disk
执行此服务前更改组,从第二个参数开始,都是此进程的补充组:
socket zygote stream 660 root system
创建一个domain socket,第一个参数是此socket的名字,第二个是类型dgram, stream 或者seqpacket其中一个,660为权限设置,后面的为用户以及组:
onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
服务重启时要执行的命令:
task_profiles ProcessCapacityHigh MaxPerformance
设置任务配置文件:
critical window=${zygote.critical_window.minute:-off} target=zygote-fatal
指定此服务为关键服务:
至此,我们就对照文档了解了整个zygote rc文件的指令,后续如果遇到其它的rc文件,也可以照此办法进行解读。
Android Init Language 源码
Andorid解析rc文件的源码,主要在/system/core/init
下面:
比如如果你想了解Android是如何通过解析rc文件创建并启动service的,可以查阅service.cpp
,service_list.cpp
,service_parser.cpp
,service_utils.cpp
,这些相关文件。