天天看点

《Android的设计与实现:卷I》——第3章 3.4.2init.rc的内容

3.4.2 init.rc的内容

熟悉了android初始化语言,再来阅读init.rc文件就容易多了。以下是init.rc的内容:

《Android的设计与实现:卷I》——第3章 3.4.2init.rc的内容
《Android的设计与实现:卷I》——第3章 3.4.2init.rc的内容

service zygote /system/bin/app_process

-xzygote /system/bin --zygote --start-system-server

class main

socket zygote stream 660 root system

onrestart write /sys/android_power/request_state wake

onrestart write /sys/power/state on

onrestart restart media

onrestart restart netd

3.4.3 解析配置文件

我们已经熟悉了android初始化语言和init.rc的内容。那init程序又是如何解析init.rc的呢?

解析init.rc的函数是init_parse_config_file("/init.rc"),位于/system/core/init/init_parser.c。代码如下:

int init_parse_config_file(const char fn)

{

char data;

/调用open、read,malloc读取init.rc到buffer;

}

从init_parse_config_file 的函数体可以看出,它主要做了读取文件、解析文件、调试文件这三部分工作。读取文件和调试文件比较简单,都是基本的c函数。这里重点分析解析文件的部分,即parse_config(fn, data),该函数定义于init_parser.c中,代码如下:

static void parse_config(const char fn, char s)

break;

case t_text:

if (nargs < init_parser_maxargs) {

parser_done:

……

parse_config函数中主要做了两部分工作。首先提供了一个parse_state结构体存储当前解析状态,然后提供一个无限循环开始解析初始化文件。

解析过程是按行解析,并根据关键字匹配,如果遇到section,便调用parse_new_section函数,进入section的解析过程。parse_state定义在parser.h中,lookup_keyword和parse_new_section定义在init_parser.c中,其中lookup_keyword就是一个简单的switch语句,用来根据传入的参数匹配不同的关键字。

下面继续分析parse_new_section的内容,代码如下:

void parse_new_section(struct parse_state state, int kw, int nargs, charargs)

分析到这里,init.rc的解析过程基本明朗了。从parse_new_section函数可以看出,init.rc实际上是分成action和service两部分分别解析的。

解析service调用了parse_service和parse_line_service。

解析action调用了parse_action和parse_line_action。

接下来具体分析这4个解析函数是如何实现的。

继续阅读