亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

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

2020-04-11 12:13:20
字體:
來源:轉載
供稿:網友

對init.rc的解析是在parse_config(): [system/core/init/init_parser.c]中進行的。解析發生在init全過程中的哪個階段,參看《Android init進程啟動過程分析》。

一、解析過程

1.      掃描init.rc中的token

    找到其中的 文件結束EOF/文本TEXT/新行NEWLINE,其中的空格‘ '、‘/t'、‘/r'會被忽略,#開頭的行也被忽略掉;

    而對于TEXT,空格‘ '、‘/t'、‘/r'、‘/n'都是TEXT的結束標志。

2.      對每一個TEXT token,都加入到args[]數組中

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

   1) 對Section(on和service),調用parse_new_section() 解析:

     - 對on section,調用parse_action(),并設置解析函數parse_line為parse_line_action()

     - 對service section,調用parse_service(),并設置解析函數parse_line為parse_line_service()

   2) 對其他關鍵字的行(非on或service開頭的地方,也就是沒有切換section)調用parse_line()

     也就是,

       - 對于on section內的命令行,調用parse_line_action()解析;

       - 對于service section內的命令行,調用parse_line_service()解析。

二、關鍵數據類型原型及關鍵數據定義

2.1 Token的定義

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

#defineT_EOF 0
#defineT_TEXT 1
#defineT_NEWLINE 2
2.2 關鍵字定義

[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]

復制代碼 代碼如下:

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?

復制代碼 代碼如下:

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時,遇到on action通過act->alist加入;

    queue_builtin_action()把執行的函數組成command,創建action,掛在action_list上。

action_queue

    執行action_for_each_trigger(),通過act->qlist加入;

    queue_builtin_action()把執行的函數組成command,創建action,掛在action_list上,并追加到action_queue的隊尾。

三、對action的解析

結合init的啟動過程以及前面講述的init.rc的解析,總結一下對init對init.rc里action的解析.

3.1 on section內action的解析

    1.3.1中解析到新的on section調用parse_action()時,申請了struct action *act,設置:

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

     2) 初始化list act->commands;

     3) 把act->alist加入到action_list的列尾

    這樣,action創建并加入到了action_list中。

3.2 on section內action里的command的解析

    對on section內action里的command,調用parse_line_action()

     1) 查找關鍵字,核對是否是COMMAND,參數數目是否正確

     2) 申請struct command *cmd

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

       - 設置參數個數給cmd->nargs,拷貝參數給cmd->args;

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

    這樣,command加入到了action中。

3.3 action_list里的action加入action_queue中

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

    queue_builtin_action()把執行的函數組成command,創建action,掛在action_list上,并追加到action_queue的隊尾。

3.4 命令的執行

    Init的無限循環中execute_one_command():system/core/init/init.c

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

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

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

上面步驟中1, 2 & 3是一次執行的,4是無限循環執行,從action_queue上取下action,action里獲得command,然后執行command。

 四、init.rc語法小結

    system/core/init/Readme里有init.rc語法的描述。之前筆者沒有分析init源碼時,也讀過這個Readme文件,但是對一些概念界定都搞不太清楚。現在分析過init.rc的解析之后,下面試著對init.rc語法做一下梳理。

1.      #開頭的行也被忽略掉,用于注釋;

2.      ‘'、‘/t'、‘/r'都會被忽略,所以屬性中含有空格的話,后面的不會被識別;每一個Action里command前的縮進并無語法的要求,只是便于人閱讀;

3.      ‘/n'是換行的標志,init語法里新解析的開始都是基于新行開始才進行的,是逐行掃描解析的;

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

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

-         遇到on <trigger>,trigger是觸發條件,發生的時機。可以是early-init / init / early-fs / fs / post-fs / early-boot / boot;也可以是property:<name>=<value>,屬性<name>的值被設置為<value>時;device-added-<path>/ device-removed-<path>設備節點被加入或移除時;service-exited-<name>服務退出時。

-         on <trigger>發生時,執行action,也就是on<trigger>后面的部分,可包含多個command;

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


形式如下:

[cpp]

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

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

總結

本文解析了init.rc的基本語法,重點討論on section的解析,service的解析以及property的支持在后續專題中再詳細討論。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区久久| 韩国精品美女www爽爽爽视频| 久久久噜噜噜久久中文字免| 亚洲综合社区网| 日本久久久久久久久久久| 欧美亚洲成人精品| 91成品人片a无限观看| 欧美俄罗斯性视频| 久久久久久中文| 亚洲日本中文字幕免费在线不卡| 不用播放器成人网| 久久久久国产精品免费网站| 亚洲码在线观看| 欧美大片在线看免费观看| 欧美二区在线播放| 亚洲国产女人aaa毛片在线| 欧美一区二粉嫩精品国产一线天| 91久久国产综合久久91精品网站| 亚洲午夜性刺激影院| 69久久夜色精品国产69乱青草| 一本大道久久加勒比香蕉| 疯狂欧美牲乱大交777| 青青草成人在线| 亚洲精选一区二区| 日韩精品免费在线视频| 成人网中文字幕| 欧美性猛交xxxx乱大交极品| 亚洲嫩模很污视频| 欧美插天视频在线播放| 欧美午夜久久久| 欧美激情videoshd| 久久精品视频一| 国产成人精品亚洲精品| 亚洲老板91色精品久久| 亚洲第一精品电影| 日韩中文字幕精品视频| 日韩欧美在线中文字幕| 亚洲成av人片在线观看香蕉| 国产精品美女av| 日韩中文有码在线视频| 亚洲大胆人体视频| 国产69精品久久久久9| 欧美日韩综合视频网址| 91精品视频观看| 精品中文字幕在线| 国产精品美女在线观看| 精品国产一区二区三区四区在线观看| 国产成人一区二区| 久久久久国产精品免费| 亚洲va欧美va国产综合剧情| 日韩在线视频二区| 777精品视频| 这里只有精品在线播放| 国产美女直播视频一区| 九九久久精品一区| 国产成人久久久| 欧美性猛交xxxx乱大交极品| 国产成+人+综合+亚洲欧洲| 国产精品高清网站| 国产精品白丝jk喷水视频一区| 久久国产精品久久久久久久久久| 成人免费在线视频网站| 黄色精品在线看| 国产成人精品一区| 精品美女久久久久久免费| 亚洲人高潮女人毛茸茸| 欧美精品999| 精品露脸国产偷人在视频| 欧美精品日韩三级| 黄色成人av在线| 日韩视频欧美视频| 日韩精品中文字幕久久臀| 91在线视频导航| 久久影视电视剧凤归四时歌| 欧美日韩电影在线观看| 欧美日韩在线第一页| 国产精品久久国产精品99gif| 国产精品视频在线播放| 亚洲丝袜av一区| 97久久精品在线| 国内精品中文字幕| 国产精品久久久久久亚洲影视| 97在线视频免费播放| 欧美一区二区三区免费观看| 久久久久免费精品国产| 深夜福利日韩在线看| 国内精品久久久| 色综合久久精品亚洲国产| 日韩精品免费一线在线观看| 久久久免费精品视频| 亚洲新中文字幕| 宅男66日本亚洲欧美视频| 热久久视久久精品18亚洲精品| 欧美精品日韩三级| 热久久99这里有精品| 91在线直播亚洲| 国产精品成人观看视频国产奇米| 欧美最猛性xxxxx(亚洲精品)| 国产女精品视频网站免费| 欧美精品videossex88| 亚洲春色另类小说| 精品国产乱码久久久久酒店| 国产99久久精品一区二区永久免费| 97在线观看视频国产| 日韩电影网在线| 久久青草福利网站| 日韩在线高清视频| 亚洲精品98久久久久久中文字幕| 国产91ⅴ在线精品免费观看| 久久国产视频网站| 亚洲国产另类久久精品| 中文字幕视频在线免费欧美日韩综合在线看| 国产在线观看91精品一区| 日韩天堂在线视频| 亚洲国产私拍精品国模在线观看| 亚洲一区二区三区四区在线播放| 亚洲国产精品电影| 欧美午夜激情小视频| 久久五月情影视| 国产欧美精品久久久| 国模吧一区二区| 日本精品免费一区二区三区| 97av在线播放| 国产日韩欧美在线播放| 欧美日韩国产中文字幕| 2019国产精品自在线拍国产不卡| 亚洲欧美日韩国产成人| 久久99精品久久久久久琪琪| 国产精品成熟老女人| 国产视频久久久久| 亚洲欧美福利视频| 久久男人的天堂| 亚洲电影免费观看高清完整版在线| 国产欧美精品va在线观看| 国产剧情日韩欧美| 亚洲一区av在线播放| 国产区亚洲区欧美区| 91国产精品电影| 久久久噜久噜久久综合| 97久久伊人激情网| 亚洲另类欧美自拍| 日本精品久久中文字幕佐佐木| 成人免费视频xnxx.com| 久久亚洲精品视频| 亚洲韩国青草视频| 日韩av在线免费观看| 国产精品日韩欧美| 在线观看精品国产视频| zzjj国产精品一区二区| xxx一区二区| 成人女保姆的销魂服务| 欧美高跟鞋交xxxxxhd| 日韩av手机在线观看| 亚洲人成自拍网站| 91日韩在线播放| 欧美精品国产精品日韩精品| 九九热这里只有在线精品视| 国产日韩在线免费| 国产精品日韩久久久久| 国产精品日韩电影| 中文字幕精品一区二区精品| 亚洲欧美日韩中文在线制服| 亚洲女人被黑人巨大进入al| 日韩av不卡在线|