android启动过程配置文件的解析与语法

    技术2022-05-17  34

    (1)android启动文件系统后调用的第一个应用程序是/init,此文件的很重要的内容是解析了init.rc和init.xxx.rc两个配置文件,然后执行解析出来的任务。相关代码在android源代码/system/core/init/init.c文件中,如下:    parse_config_file("/init.rc");

        /* pull the kernel commandline and ramdisk properties file in */    qemu_init();    import_kernel_cmdline(0);

        get_hardware_name();    snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);    parse_config_file(tmp);

    (2)从上面代码可以看到,第一个配置文件名称固定为init.rc,而第二个配置文件格式为init.xxx.rc,其中xxx部分的内容是从内核读取的,具体是读取文件/proc/cpuinfo中的Hardware部分,然后截取其部分内容。Hardware部分是定义在内核的主板定义文件中,我的平台是定义在内核arch/arm/mach-mmp/merlin.c中,我的平台定义如下:MACHINE_START(ARDENT_MERLIN, "PXA168-based Merlin Platform")    .phys_io = APB_PHYS_BASE,    .boot_params = 0x00000100,    .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,    .map_io = pxa_map_io,    .init_irq = pxa168_init_irq,    .timer = &pxa168_timer,    .init_machine = merlin_init,MACHINE_END这样截取到的hardware部分的内容就为pxa168-based,也就是说我的平台的第二个配置文件应该命名为init.pxa168-based.rc

    (3)从上面看init.xxx.rc中的xxx内容是取决是内核中主板的定义的,如果觉得麻烦,可以将其在代码中写死,例如:    parse_config_file(“init.merlin.rc”);

    (4)配置文件的语法如下:(a)配置文件的内容包含有4种:     动作(Action)     命令(Commands)     服务(Services)     选项(Options)(b)动作和命令一起使用,形式如下:on <trigger>  <command>  <command>  <command>其中trigger是触发条件,也就是说在满足触发条件的情况下执行1个或多个相应的命令,举例如下:on property:persist.service.adb.enable=1    start adbd

    (c)服务和选项一起使用,形式如下:  service <name> <pathname> [ <argument> ]*  <option>  <option>  ...上面内容解释为:  service 服务名称 服务对应的命令的路径 命令的参数    选项    选项  ...举例如下:service ril-daemon /system/bin/rild    socket rild stream 660 root radio    socket rild-debug stream 660 radio system    user root    group radio cache inet misc audio上面的服务对应到/system/bin/rild命令,没有参数,服务名称为ril-daemon,后面的内容都是服务的选项。

    (d)选项是影响服务启动和运行的参数,主要的选项如下:

    disabled  禁用服务,此服务开机时不会自动启动,但是可以在应用程序中手动启动它。

    socket <type> <name> <perm> [ <user> [ <group> ] ]套接字    类型        名称           权限           用户           组创建一个名为/dev/socket/<name>,然后把它的fd传给启动程序类型type的值为dgram或者streamperm表示该套接字的访问权限,user和group表示改套接字所属的用户和组,这两个参数默认都是0,因此可以不设置。

    user <username>执行服务前切换到用户<username>,此选项默认是root,因此可以不设置。

    group <groupname> [ <groupname> ]*执行服务前切换到组<groupname>,此选项默认是root,因此可以不设置

    capability [ <capability> ]+执行服务前设置linux capability,没什么用。

    oneshot服务只启动一次,一旦关闭就不能再启动。

    class <name>为服务指定一个类别,默认为"default",同一类别的服务必须一起启动和停止

    (e)动作触发条件<trigger>boot  首个触发条件,初始化开始(载入配置文件)的时候触发

    <name>=<value>当名为<name>的属性(property)的值为<value>的时候触发

    device-added-<path>路径为<path>的设置添加的时候触发

    device-removed-<path>路径为<path>的设置移除的时候触发

    service-exited-<name>名为<name>的服务关闭的时候触发

    (f)命令(Command)的形式exec <path> [ <argument> ]*复制(fork)和执行路径为<path>的应用程序,<argument>为该应用程序的参数,在该应用程序执行完前,此命令会屏蔽,

    export <name> <value>声明名为<name>的环境变量的值为<value>,声明的环境变量是系统环境变量,启动后一直有效。

    ifup <interface>启动名为<interface>的网络接口

    import <filename>加入新的位置文件,扩展当前的配置。

    hostname <name>设置主机名

    class_start <serviceclass>启动指定类别的所有服务

    class_stop <serviceclass>停止指定类别的所有服务

    domainname <name>设置域名

    insmod <path>加载路径为<path>的内核模块

    mkdir <path>创建路径为<path>目录

    mount <type> <device> <dir> [ <mountoption> ]*挂载类型为<type>的设备<device>到目录<dir>,<mountoption>为挂载参数,距离如下:    mount ubifs ubi1_0 /data nosuid nodev

    setkey暂时未定义

    setprop <name> <value>设置名为<name>的系统属性的值为<value>

    setrlimit <resource> <cur> <max>设置资源限制,举例:# set RLIMIT_NICE to allow priorities from 19 to -20    setrlimit 13 40 40没看懂是什么意思。

    start <service>启动服务(如果服务未运行)

    stop <service>停止服务(如果服务正在运行)

    symlink <target> <path>创建一个从<path>指向<target>的符号链接,举例:    symlink /system/etc /etc

    write <path> <string> [ <string> ]*打开路径为<path>的文件并将一个多这多个字符串写入到该文件中。

    (g)系统属性(Property)android初始化过程中会修改一些属性,通过getprop命令我们可以看到属性值,这些属性指示了某些动作或者服务的状态,主要如下:init.action      如果当前某个动作正在执行则init.action属性的值等于该动作的名称,否则为""init.command     如果当前某个命令正在执行则init.command属性的值等于该命令的名称,否则为""init.svc.<name>  此属性指示个名为<name>的服务的状态("stopped", "running", 或者 "restarting").

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/jiajie961/archive/2010/11/11/6002871.aspx


    最新回复(0)