天天看點

《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個解析函數是如何實作的。

繼續閱讀