消息关闭
    暂无新消息!

Android的init过程(一)

本文使用的软件版本

Android:4.2.2

Linux内核:3.1.10

    在上一篇文章中介绍了init的初始化第一阶段,也就是处理各种属性。在本文将会详细分析init最重要的一环:解析init.rc文件。

init.rc 文件并不是普通的配置文件,而是由一种被称为“Android初始化语言”(Android Init Language,这里简称为AIL)的脚本写成的文件。在了解init如何解析init.rc文件之前,先了解AIL非常必要,否则机械地分析 init.c及其相关文件的源代码毫无意义。

     为了学习AIL,读者可以到自己Android手机的根目录寻找init.rc文件,最好下载到本地以便查看,如果有编译好的Android源代码, 在out/target/product/generic/root目录也可找到init.rc文件。

AIL由如下4部分组成。

1.  动作(Actions)

2.  命令(Commands)

3. 服务(Services)

4.  选项(Options)

     这4部分都是面向行的代码,也就是说用回车换行符作为每一条语句的分隔符。而每一行的代码由多个符号(Tokens)表示。可以使用反斜杠转义符在 Token中插入空格。双引号可以将多个由空格分隔的Tokens合成一个Tokens。如果一行写不下,可以在行尾加上反斜杠,来连接下一行。也就是 说,可以用反斜杠将多行代码连接成一行代码。

     AIL的注释与很多Shell脚本一行,以#开头。

     AIL在编写时需要分成多个部分(Section),而每一部分的开头需要指定Actions或Services。也就是说,每一个Actions或 Services确定一个Section。而所有的Commands和Options只能属于最近定义的Section。如果Commands和 Options在第一个Section之前被定义,它们将被忽略。

Actions和Services的名称必须唯一。如果有两个或多个Action或Service拥有同样的名称,那么init在执行它们时将抛出错误,并忽略这些Action和Service。

下面来看看Actions、Services、Commands和Options分别应如何设置。

Actions的语法格式如下:

on   
     
     
   

      也就是说Actions是以关键字on开头的,然后跟一个触发器,接下来是若干命令。例如,下面就是一个标准的Action。

    on boot  
        ifup lo  
        hostname localhost  
        domainname localdomain  

其中boot是触发器,下面三行是command

那么init.rc到底支持哪些触发器呢?目前init.rc支持如下5类触发器。

1.  boot

   这是init执行后第一个被触发Trigger,也就是在 /init.rc被装载之后执行该Trigger

2.  =

   当属性被设置成时被触发。例如,

on property:vold.decrypt=trigger_reset_main

    class_reset main

3.  device-added-

    当设备节点被添加时触发

4.  device-removed-

   当设备节点被移除时添加

5. service-exited-

   会在一个特定的服务退出时触发

Actions后需要跟若干个命令,这些命令如下:

1.  exec [ ]*

  创建和执行一个程序()。在程序完全执行前,init将会阻塞。由于它不是内置命令,应尽量避免使用exec ,它可能会引起init执行超时。

    2.  export

在全局环境中将 变量的值设为。(这将会被所有在这命令之后运行的进程所继承)

3.  ifup

   启动网络接口

4.  import

   指定要解析的其他配置文件。常被用于当前配置文件的扩展

5.  hostname

   设置主机名

6.  chdir

   改变工作目录

7.  chmod

   改变文件的访问权限

8.  chown

   更改文件的所有者和组

9.  chroot

  改变处理根目录

10.  class_start

   启动所有指定服务类下的未运行服务。

11  class_stop

  停止指定服务类下的所有已运行的服务。

12.  domainname

   设置域名

13.  ins