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