当前位置:操作系统 > 安卓/Android >>

Android中init.rc文件的解析

本文分析Android中如何解析init.rc文件,重点描述了on action内的解析,并从解析的过程中总结出init.rc的语法规范。
 
 
 
对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,    
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,