3.4.2 init.rc的内容
熟悉了android初始化语言,再来阅读init.rc文件就容易多了。以下是init.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个解析函数是如何实现的。