麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 系統(tǒng) > Android > 正文

Android中init.rc文件的解析 分享

2020-04-11 12:13:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

對(duì)init.rc的解析是在parse_config(): [system/core/init/init_parser.c]中進(jìn)行的。解析發(fā)生在init全過(guò)程中的哪個(gè)階段,參看《Android init進(jìn)程啟動(dòng)過(guò)程分析》。

一、解析過(guò)程

1.      掃描init.rc中的token

    找到其中的 文件結(jié)束EOF/文本TEXT/新行NEWLINE,其中的空格‘ '、‘/t'、‘/r'會(huì)被忽略,#開(kāi)頭的行也被忽略掉;

    而對(duì)于TEXT,空格‘ '、‘/t'、‘/r'、‘/n'都是TEXT的結(jié)束標(biāo)志。

2.      對(duì)每一個(gè)TEXT token,都加入到args[]數(shù)組中

3.  當(dāng)遇到新一行(‘/n')的時(shí)候,用args[0]通過(guò)lookup_keyword()檢索匹配關(guān)鍵字;

   1) 對(duì)Section(on和service),調(diào)用parse_new_section() 解析:

     - 對(duì)on section,調(diào)用parse_action(),并設(shè)置解析函數(shù)parse_line為parse_line_action()

     - 對(duì)service section,調(diào)用parse_service(),并設(shè)置解析函數(shù)parse_line為parse_line_service()

   2) 對(duì)其他關(guān)鍵字的行(非on或service開(kāi)頭的地方,也就是沒(méi)有切換section)調(diào)用parse_line()

     也就是,

       - 對(duì)于on section內(nèi)的命令行,調(diào)用parse_line_action()解析;

       - 對(duì)于service section內(nèi)的命令行,調(diào)用parse_line_service()解析。

二、關(guān)鍵數(shù)據(jù)類型原型及關(guān)鍵數(shù)據(jù)定義

2.1 Token的定義

[cpp]
#defineT_EOF 0  
#defineT_TEXT 1  
#defineT_NEWLINE 2 

#defineT_EOF 0
#defineT_TEXT 1
#defineT_NEWLINE 2
2.2 關(guān)鍵字定義

[cpp]
KEYWORD(capability,  OPTION, 0, 0) 
KEYWORD(chdir,       COMMAND, 1, do_chdir) 
KEYWORD(chroot,      COMMAND, 1, do_chroot) 
KEYWORD(class,       OPTION, 0, 0) 
KEYWORD(class_start, COMMAND, 1,do_class_start) 
KEYWORD(class_stop,  COMMAND, 1, do_class_stop) 
KEYWORD(console,     OPTION, 0, 0) 
KEYWORD(critical,    OPTION, 0, 0) 
KEYWORD(disabled,    OPTION, 0, 0) 
KEYWORD(domainname,  COMMAND, 1, do_domainname) 
KEYWORD(exec,        COMMAND, 1, do_exec) 
KEYWORD(export,      COMMAND, 2, do_export) 
KEYWORD(group,       OPTION, 0, 0) 
KEYWORD(hostname,    COMMAND, 1, do_hostname) 
KEYWORD(ifup,        COMMAND, 1, do_ifup) 
KEYWORD(insmod,      COMMAND, 1, do_insmod) 
KEYWORD(import,      COMMAND, 1, do_import) 
KEYWORD(keycodes,    OPTION, 0, 0) 
KEYWORD(mkdir,       COMMAND, 1, do_mkdir) 
KEYWORD(mount,       COMMAND, 3, do_mount) 
KEYWORD(on,          SECTION, 0, 0) 
KEYWORD(oneshot,     OPTION, 0, 0) 
KEYWORD(onrestart,   OPTION, 0, 0) 
KEYWORD(restart,     COMMAND, 1, do_restart) 
KEYWORD(service,     SECTION, 0, 0) 
KEYWORD(setenv,      OPTION, 2, 0) 
KEYWORD(setkey,      COMMAND, 0, do_setkey) 
KEYWORD(setprop,     COMMAND, 2, do_setprop) 
KEYWORD(setrlimit,   COMMAND, 3, do_setrlimit) 
KEYWORD(socket,      OPTION, 0, 0) 
KEYWORD(start,       COMMAND, 1, do_start) 
KEYWORD(stop,        COMMAND, 1, do_stop) 
KEYWORD(trigger,     COMMAND, 1, do_trigger) 
KEYWORD(symlink,     COMMAND, 1, do_symlink) 
KEYWORD(sysclktz,    COMMAND, 1, do_sysclktz) 
KEYWORD(user,        OPTION, 0, 0) 
KEYWORD(wait,        COMMAND, 1, do_wait) 
KEYWORD(write,       COMMAND, 2, do_write) 
KEYWORD(copy,        COMMAND, 2, do_copy) 
KEYWORD(chown,       COMMAND, 2, do_chown) 
KEYWORD(chmod,       COMMAND, 2, do_chmod) 
KEYWORD(loglevel,    COMMAND, 1, do_loglevel) 
KEYWORD(ioprio,      OPTION, 0, 0) 

    KEYWORD(capability,  OPTION, 0, 0)
    KEYWORD(chdir,       COMMAND, 1, do_chdir)
    KEYWORD(chroot,      COMMAND, 1, do_chroot)
    KEYWORD(class,       OPTION, 0, 0)
    KEYWORD(class_start, COMMAND, 1,do_class_start)
    KEYWORD(class_stop,  COMMAND, 1, do_class_stop)
    KEYWORD(console,     OPTION, 0, 0)
    KEYWORD(critical,    OPTION, 0, 0)
    KEYWORD(disabled,    OPTION, 0, 0)
    KEYWORD(domainname,  COMMAND, 1, do_domainname)
    KEYWORD(exec,        COMMAND, 1, do_exec)
    KEYWORD(export,      COMMAND, 2, do_export)
    KEYWORD(group,       OPTION, 0, 0)
    KEYWORD(hostname,    COMMAND, 1, do_hostname)
    KEYWORD(ifup,        COMMAND, 1, do_ifup)
    KEYWORD(insmod,      COMMAND, 1, do_insmod)
    KEYWORD(import,      COMMAND, 1, do_import)
    KEYWORD(keycodes,    OPTION, 0, 0)
    KEYWORD(mkdir,       COMMAND, 1, do_mkdir)
    KEYWORD(mount,       COMMAND, 3, do_mount)
    KEYWORD(on,          SECTION, 0, 0)
    KEYWORD(oneshot,     OPTION, 0, 0)
    KEYWORD(onrestart,   OPTION, 0, 0)
    KEYWORD(restart,     COMMAND, 1, do_restart)
    KEYWORD(service,     SECTION, 0, 0)
    KEYWORD(setenv,      OPTION, 2, 0)
    KEYWORD(setkey,      COMMAND, 0, do_setkey)
    KEYWORD(setprop,     COMMAND, 2, do_setprop)
    KEYWORD(setrlimit,   COMMAND, 3, do_setrlimit)
    KEYWORD(socket,      OPTION, 0, 0)
    KEYWORD(start,       COMMAND, 1, do_start)
    KEYWORD(stop,        COMMAND, 1, do_stop)
    KEYWORD(trigger,     COMMAND, 1, do_trigger)
    KEYWORD(symlink,     COMMAND, 1, do_symlink)
    KEYWORD(sysclktz,    COMMAND, 1, do_sysclktz)
    KEYWORD(user,        OPTION, 0, 0)
    KEYWORD(wait,        COMMAND, 1, do_wait)
    KEYWORD(write,       COMMAND, 2, do_write)
    KEYWORD(copy,        COMMAND, 2, do_copy)
    KEYWORD(chown,       COMMAND, 2, do_chown)
    KEYWORD(chmod,       COMMAND, 2, do_chmod)
    KEYWORD(loglevel,    COMMAND, 1, do_loglevel)
    KEYWORD(ioprio,      OPTION, 0, 0)
2.3 struct action 和struct command

 
[cpp]

復(fù)制代碼 代碼如下:

struct action { 
        /* node in list of all actions */ 
    struct listnode alist; 
        /* node in the queue of pending actions*/ 
    struct listnode qlist; 
        /* node in list of actions for atrigger */ 
    struct listnode tlist; 

    unsigned hash; 
    const char *name; 

    struct listnode commands; 
    struct command *current; 
}; 

struct action {
        /* node in list of all actions */
    struct listnode alist;
        /* node in the queue of pending actions*/
    struct listnode qlist;
        /* node in list of actions for atrigger */
    struct listnode tlist;

    unsigned hash;
    const char *name;

    struct listnode commands;
    struct command *current;
};

[cpp]

view plaincopyprint?

復(fù)制代碼 代碼如下:

struct command 

        /* list of commands in an action */ 
    struct listnode clist; 

    int (*func)(int nargs, char **args); 
    int nargs; 
    char *args[1]; 
}; 

struct command
{
        /* list of commands in an action */
    struct listnode clist;

    int (*func)(int nargs, char **args);
    int nargs;
    char *args[1];
};

2.4 list action_list和action_queue

action_list

    解析init.rc時(shí),遇到on action通過(guò)act->alist加入;

    queue_builtin_action()把執(zhí)行的函數(shù)組成command,創(chuàng)建action,掛在action_list上。

action_queue

    執(zhí)行action_for_each_trigger(),通過(guò)act->qlist加入;

    queue_builtin_action()把執(zhí)行的函數(shù)組成command,創(chuàng)建action,掛在action_list上,并追加到action_queue的隊(duì)尾。

三、對(duì)action的解析

結(jié)合init的啟動(dòng)過(guò)程以及前面講述的init.rc的解析,總結(jié)一下對(duì)init對(duì)init.rc里action的解析.

3.1 on section內(nèi)action的解析

    1.3.1中解析到新的on section調(diào)用parse_action()時(shí),申請(qǐng)了struct action *act,設(shè)置:

     1) act->name為on section的名字(比如boot/fs/);

     2) 初始化list act->commands;

     3) 把a(bǔ)ct->alist加入到action_list的列尾

    這樣,action創(chuàng)建并加入到了action_list中。

3.2 on section內(nèi)action里的command的解析

    對(duì)on section內(nèi)action里的command,調(diào)用parse_line_action()

     1) 查找關(guān)鍵字,核對(duì)是否是COMMAND,參數(shù)數(shù)目是否正確

     2) 申請(qǐng)struct command *cmd

       - cmd->func從keyword表中獲取;

       - 設(shè)置參數(shù)個(gè)數(shù)給cmd->nargs,拷貝參數(shù)給cmd->args;

       - 把cmd->clist加入到act->commands的列尾

    這樣,command加入到了action中。

3.3 action_list里的action加入action_queue中

    action_for_each_trigger()把隊(duì)列action_list里所匹配的action,追加到action_queue的隊(duì)尾;

    queue_builtin_action()把執(zhí)行的函數(shù)組成command,創(chuàng)建action,掛在action_list上,并追加到action_queue的隊(duì)尾。

3.4 命令的執(zhí)行

    Init的無(wú)限循環(huán)中execute_one_command():system/core/init/init.c

      1) 從action_queue取下structaction *act賦給cur_action;

      2) 從cur_action獲得struct command *賦給cur_command;

      3) 執(zhí)行cur_command->func(cur_command->nargs, cur_command->args)

上面步驟中1, 2 & 3是一次執(zhí)行的,4是無(wú)限循環(huán)執(zhí)行,從action_queue上取下action,action里獲得command,然后執(zhí)行command。

 四、init.rc語(yǔ)法小結(jié)

    system/core/init/Readme里有init.rc語(yǔ)法的描述。之前筆者沒(méi)有分析init源碼時(shí),也讀過(guò)這個(gè)Readme文件,但是對(duì)一些概念界定都搞不太清楚。現(xiàn)在分析過(guò)init.rc的解析之后,下面試著對(duì)init.rc語(yǔ)法做一下梳理。

1.      #開(kāi)頭的行也被忽略掉,用于注釋;

2.      ‘'、‘/t'、‘/r'都會(huì)被忽略,所以屬性中含有空格的話,后面的不會(huì)被識(shí)別;每一個(gè)Action里command前的縮進(jìn)并無(wú)語(yǔ)法的要求,只是便于人閱讀;

3.      ‘/n'是換行的標(biāo)志,init語(yǔ)法里新解析的開(kāi)始都是基于新行開(kāi)始才進(jìn)行的,是逐行掃描解析的;

4.      一些概念:Section / Action / Command / Trigger

-         Init.rc里,遇到on<trigger>或service <name> <pathname> [ <argument> ]*行,標(biāo)志著一個(gè)新section的開(kāi)始[參看2.2里關(guān)鍵字定義里,類型為SECTION的也就只有on和service];

-         遇到on <trigger>,trigger是觸發(fā)條件,發(fā)生的時(shí)機(jī)。可以是early-init / init / early-fs / fs / post-fs / early-boot / boot;也可以是property:<name>=<value>,屬性<name>的值被設(shè)置為<value>時(shí);device-added-<path>/ device-removed-<path>設(shè)備節(jié)點(diǎn)被加入或移除時(shí);service-exited-<name>服務(wù)退出時(shí)。

-         on <trigger>發(fā)生時(shí),執(zhí)行action,也就是on<trigger>后面的部分,可包含多個(gè)command;

-         command每條一行,支持哪些command,看2.2里關(guān)鍵字定義里類型為COMMAND的關(guān)鍵字。


形式如下:

[cpp]

on <trigger> 
    <command> 
    <command> 
    <command> 

on <trigger>
    <command>
    <command>
    <command>這整個(gè)是一個(gè)Section;所有<command>叫action。

總結(jié)

本文解析了init.rc的基本語(yǔ)法,重點(diǎn)討論on section的解析,service的解析以及property的支持在后續(xù)專題中再詳細(xì)討論。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美日本综合 | 久久人人97超碰国产公开结果 | 看毛片免费 | 亚洲码无人客一区二区三区 | 911色_911色sss主站色播 | 色毛片| 天天好比网 | 日韩中文字幕一区二区三区 | 久久国产综合视频 | 奶子吧naiziba.cc免费午夜片在线观看 | 内地av在线 | 黄色网络免费看 | 国产亚洲激情 | 爽爽淫人综合网网站 | 精品一区视频 | 欧美视频一区二区 | 成人男女激情免费视频 | 爽爽视频免费看 | hdjapanesemassagehd日本| 国产一区精品在线观看 | 一级国产精品一级国产精品片 | 中国美女一级黄色大片 | 日本中文视频 | 色综合久久久久久久久久久 | 久久成人免费网 | 亚洲视色 | 91久久精品一二三区 | 日本在线播放一区二区三区 | 精品91av| 黄色一级片免费在线观看 | 成人午夜在线免费观看 | 欧美一区中文字幕 | 精品国产一区二区三 | 成人国产精品一区二区毛片在线 | 亚洲导航深夜福利涩涩屋 | 二区三区四区 | 成人午夜一区二区 | 久久tv免费国产高清 | 日韩中字幕 | 国产91久久久久久 | 国产精品午夜在线观看 |