Android Initial Language

Android Initial Language

1 概述

Android Init Language,简称AIL,即安卓初始化语言。Android init进程解析的扩展名为rc文件就是用这种语言写的。

所有语法规则都可以在readme.txt文件中获取。本文基于Android N的readme文件进行讲解,基本是对此文件的翻译,感觉翻译不到位的,可以查看原英文文件,路径如下:

android/system/core/init/readme.txt

2 语法

安卓初始化语言由五大类语句组成,分别是Actions、Commands、Services、Options和Imports。

所有这些都是以行为单位,各种记号由空格来隔开。C语言风格的反斜杠号可用于在记号间插入空格。双引号也可用于防止字符串被空格分割成多个记号。行末的反斜杠用于折行。

注释行以井号(#)开头(允许以空格开头)。

Actions和Services声明一个新的分组。所有的命令或选项都属于最近申明的分组。位于第一个分组之前的命令或选项将会被忽略。 Actions和Services有唯一的名字。如果Action出现重名,第二个Action的commands将被加在第一个的后面。如果Services出现重名,第二个将被忽略,并且会打印一条错误日志。

2.1 Actions

Actions其实就是一序列的Commands(命令)。Actions都有一个trigger(触发器),它被用于决定action的执行时间。当一个符合action触发条件的事件发生时,action会被加入到执行队列的末尾,除非它已经在队列里了。

队列中的每一个action都被依次提取出,而这个action中的每个command(命令)都将被依次执行。Init在这些命令的执行期间还控制着其他的活动(设备节点的创建和注销、属性的设置、进程的重启)。

Actions格式如下:

image.png

2.2 Triggers

触发器本质上是一个字符串,能够匹配某种包含该字符串的事件。触发器又被细分为事件触发器(event trigger)和属性触发器(property trigger)。触发器是一个用于匹配特定事件类型的字符串,用于是Actions发生。

事件触发器可由"trigger"命令触发,或初始化过程中通过QueueEventTrigger()触发,通常是一些事先定义的简单字符串,例如:boot,late-init。

属性触发器是当指定属性的变量值变成指定值时触发,其格式为'property:<name>=<value>' and 'property:<name>=*'。

一个Action可以有多个属性触发器,但是最多有一个事件触发器.

下面我们看两个例子:

on boot && property:a=b

该Action只有在boot事件发生时,并且属性a和b相等的情况下才会被触发.

on property:a=b && property:c=d

该Action会在以下三种情况被触发:

1)在启动时,如果属性a的值等于b并且属性c的值等于d

2)在属性c的值已经是d的情况下,属性a的值被更新为b

3)在属性a的值已经是b的情况下,属性c的值被更新为d

触发器分为定义好的触发器和设置的触发器。

2.2.1 定义好的触发器

定义好的事件触发器有early-init\init\late-init,是在初始化过程中通过QueueEventTrigger()触发。

early-init

一些前置工作,创建mnt目录,挂载tmpfs等。

init

设置loglevel,建立符号链接,创建system/data/cache目录,proc/dev处理等。

late-init

触发用户设置的触发器。

2.2.2 创建的触发器

用户创建的触发器,通过2.2.1中某一个阶段的trigger命令触发。

trigger <用户创建的触发器名称>

触发某一触发器。

2.3 Commands

command有很多,请查阅readme.txt文件。

2.4 Services

Init启动的程序,可以选择要不要在退出后重启。格式如下:

image.png

2.5 Options

Options是服务的修饰符,他们影响Init运行服务的方式和时间。

Critical

这是一项设备关键型服务。 如果它在四分钟内退出超过四次以上,设备将重启进入恢复模式。

Class <name>

指定服务的类名。 命名类中的所有服务可以一起启动或停止。 如果未通过class选项指定服务,则服务在类“default”中。

Seclabel <seclabel>

在执行此服务之前更改为“seclabel”。 主要供从rootfs运行的服务使用,例如 ueventd,adbd。 系统分区上的服务可以基于其文件安全上下文使用策略定义的转换。

如果未指定且策略中未定义转换,则默认为init上下文。

group <groupname> [ <groupname> ]*

在执行此服务之前更改为groupname。 除了(必需的)第一个之外的其他组名用于设置过程的补充组(通过setgroups())。 目前默认为root。

User <username>

在执行此服务前更改为username。

Oneshot

服务退出后,不进行重启。

onrestart <xxxx>

当服务重启的时候,执行一条指令。

Disabled

此服务不会自动从其类开始。 它必须通过名称显式启动。

socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]

创建名为/ dev / socket / <name>的unix域套接字,并将其fd传递给已启动的进程。 <type>必须是“dgram”,“stream”或“seqpacket”。 用户和组默认为0.'seclabel'是套接字的SELinux安全上下文。 它默认为服务安全性上下文,由seclabel指定或基于服务可执行文件安全性上下文计算。

setenv <name> <value>

在启动的进程中将环境变量<name>设置为<value>。

ioprio <rt|be|idle> <0-7>

设置IO优先级。

writepid <file...>

当进程创建的时候,把进程ID写到给定的文件里面。意味着cgroup / cpuset的使用。

2.6 Imports

import关键字不是一个命令,而是一个部分,并在包含它的.rc文件完成解析后立即处理。

import <path>

解析init配置文件,扩展当前配置。 如果<path>是目录,则目录中的每个文件都将被解析为配置文件。 它不是递归的,嵌套目录不会被解析。

init可以执行imports的rc文件只有两次:

1)在初始引导期间导入/init.rc时

2)在mount_all期间在指定路径导入/ {system,vendor,odm} / etc / init /或.rc文件时

2.7 Properties

Init通过以下属性提供有关其负责的服务的信息。

init.svc.<name>

命名服务的状态("stopped", "stopping", "running", "restarting")。

2.8 还有介绍systrace和bootchat,感兴趣可以研究一下。

3 rc文件

init语言用于带.rc文件扩展名的纯文本文件中。 这些通常是系统中多个位置中的多个,如下所述。

/init.rc是主.rc文件,在执行开始时由init可执行文件加载。 它负责系统的初始设置。 它导入/init.${ro.hardware}.rc这是主要供应商提供的.rc文件。

在mount_all命令期间,init可执行文件加载/ {system,vendor,odm} / etc / init /目录中包含的所有文件。 在文件系统挂载后,这些目录包含所有操作和服务。

可以在mount_all命令行中指定路径,使其在指定的路径中导入.rc文件,而不是上面列出的默认路径。 这主要用于支持工厂模式和其他非标准引导模式。 三个默认路径一般用于正常引导过程。

下面是这些路径的意图:

1)/system/etc/init/放置SurfaceFlinger\MediaService\logcatd等核心系统条目。

2)/vendor/etc/init/放置芯片方案商的soc核心功能需要的actions和daemons。

3)/odm/etc/init/用于设备制造商,例如运动传感器或其他外围功能所需的操作或守护程序。

所有Services应该有service条目在相应的init.rc文件中,这些服务的二进制文件在system、vendor、odm分区,rc文件在对应分区的/etc/init/目录。每个init .rc文件还应包含与其服务关联的任何操作。

示例:位于system/core/logcat/目录中的logcatd.rc和Android.mk文件。 Android.mk文件中的LOCAL_INIT_RC宏在构建过程中将logcatd.rc放在/system/etc/init /中。 Init在mount_all命令期间加载logcatd.rc并允许运行服务并在适当时是actions如队列。

根据其守护进程分解init .rc文件比以前使用的单片init .rc文件更受欢迎。 这种方法可确保init读取的唯一服务条目和init执行的唯一操作对应于其二进制文件实际存在于文件系统上的服务,而单片init .rc文件则不然。 当将多个服务添加到系统时,这另外将有助于合并冲突解决,因为每个服务将进入单独的文件。


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容