1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > (Android7.0) init.rc与AIL(Android Init Language)语句

(Android7.0) init.rc与AIL(Android Init Language)语句

时间:2024-03-05 07:21:43

相关推荐

(Android7.0) init.rc与AIL(Android Init Language)语句

注:文章可能完全摘录,参考或完全自创,如有摘录或参考,会在文章最下面备注参考资料的地址(而不一定是原始文章的地址)。如有版权问题,请及时告知。

文章目的在于整理分享本人学到的知识,可能会有错误或表达不标准的地方,请结合实践理解。文章会不断完善,也希望更多朋友参与进来,一起成长。

(本文构成:大部分摘录,经过整理,添加部分自己的理解。)

init.rc文件由系统第一个启动的init程序进行解析.它由AIL语言编写而成。

init程序的源码init.c在kernel里,使用哪个与kernel编译的是哪个平台有关。

每个厂商客制化的init.rc名字可能不同,但编译的时候一般都会替换out下的init.rc原始文件。

结构语法

AIL语言包含主要包含五种结构语法:

ActionsServicesOptionsCommandsImportsAIL的语法很像shell,是从上到下按行处理的,而且支持换行。很多shell语句在里面也可以完全使用。

注释语法

AIL中的注释语法和Shell脚本一致,以#开头即可

结构语法详解

Actions

Actions代表一些Action.Action代表一组命令,它包含一个触发器,该触发器决定了何时执行这个Action,即在什么情况下才能执行该Action中的定义命令.当一些条件满足触发器的条件时,该Action中定义的命令会被添加到要执行命令队列的尾部(如果这组命令已经在队列中,则不会再次添加).

当一个Action从队列移除时,该Action定义的命令会依次被执行.

Action的格式如下:

on <trgger> [&& <trigger>]*<command><command><command>...

不难发现Action都是以on开始,随后会定义触发器(trigger),接着便是为其定义命令(Commmand).在开始讲解Trigger和Command之前,我们先来看一段Action的示例代码:

on boot# 初始化网络ifup lohostname localhostdomainname localdomain

trigger

trigger即我们上面所说的触发器,本质上是一个字符串,能够匹配某种包含该字符串的事件.

trigger又被细分为事件触发器(event trigger)和属性触发器(property trigger).

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

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

一个Action可以有多个属性触发器,但是最多有一个事件触发器.下面我们看两个例子:

on boot && property:a=b

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

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

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

在启动时,如果属性a的值等于b并且属性c的值等于d在属性c的值已经是d的情况下,属性a的值被更新为b在属性a的值已经是b的情况下,属性c的值被更新为d

当前AIL中常用的有以下几种事件触发器:

Commands

Commands代表一组命令,在为Action设置了触发器后,就需要为其定义一组命令(command)了.AIL中内置了众多的命令,下面我们做个简单的说明:

Services

Services代表一些Service.Service是一些在系统初始化时就启动或者退出时需要重启的程序.其格式如下:

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

不难发现,首先需要为服务定义名字,并指定程序路径,然后便是通过option来修饰服务.同样先来看一下示例:

service ueventd /sbin/ueventdclass corecriticalseclabel u:r:ueventd:s0

Options

Options代表一些option.option用来修饰服务,决定了服务在什么时候运行以及怎样运行.AIL中提供了非常多的option,下面我们做个简单说明:

Imports

用来引入一个要解析的其他配置文件,通常用于当前配置文件的扩展.

其格式如下:

import <path>

如果path是个一个目录,则该目录下的每个.rc文件都被引入.

在初始化过程中,共有两次使用import来引入.rc文件:

在初始化引导期间,引入/init.rc文件在执行mount_all命令时,引入/{system,vendor,odm}/etc/init/或者指定路径下的.rc文件

我们来看看init.rc文件引入的.rc文件:

import /init.environ.rcimport /init.usb.rcimport /init.${ro.hardware}.rcimport /init.${ro.zygote}.rc

Properties

Properties代表Init进程运行中的一些属性信息.在Init运行中,通过以下属性能够获取当前程序内部信息:

"ctl.start"与"ctl.stop"系统属性可以使init.rc中设置的服务启动或停止。(假设你要运行的Service为“vtserver”)

运行服务命令如下:SystemProperties.set("ctl.start", "vtserver");

停止服务的命令如下:

SystemProperties.set("ctl.stop", "vtserver");

运行结果init进程将会将会写入命名为“init.svc.+Service名称”的属性中,也就是“init.svc.vtserver” 属性,应用程序可以参考查阅这个值来确定Service执行的情况。

难道Android属性“ctl.start”是所有进程都可以设置的吗?那世界不就乱套了,谁都可以可以执行init.rc中Service了,查看 property_service.c中的源码,设置Android系统属性的函数为handle_property_set_fd从源码中我们发现如果设置“ctl.”开头的Android系统property,将会调用check_control_perms函数来检查调用者的权限我们发现root权限和system权限的应用程序将会授权修改“ctl.”开头的Android系统属性。否则将会检查control_perms全局变量中的定义权限和Service。

文件示例

到现在为止,有关AIL相关的知识基本介绍完毕,下面截取init.rc文件中的一段来做个简单的说明:

//引入其他要解析的rc文件import /init.environ.rcimport /init.usb.rcimport /init.${ro.hardware}.rcimport /init.usb.configfs.rcimport /init.${ro.zygote}.rc#定义了一个action,在init初始化之前触发on early-init# Set init and its forked children's oom_adj.write /proc/1/oom_score_adj -1000# Disable sysrq from keyboardwrite /proc/sys/kernel/sysrq 0# Set the security context of /adb_keys if present.restorecon /adb_keys# Shouldn't be necessary, but sdcard won't start without it. http://b/22568628.mkdir /mnt 0775 root system# Set the security context of /postinstall if present.restorecon /postinstall#启动ueventd服务start ueventd#...省略多行...#定义ueventd服务,设置服务为/sbin/ueventdservice ueventd /sbin/ueventdclass core#为其设置类名为corecritical#表明这是一个关键服务seclabel u:r:ueventd:s0 #设置其安全上下文

参考资料:

/p/d08e1affd5ec

/xiao5678yun/article/details/53381937

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。