(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或者stream
perm表示该套接字的访问权限,user和group表示改套接字所属的用户和组,这两个参数默认都是0,因此可以不设置。
user <username>
执行服务前切换到用户<username>,此选项默认是root,因此可以不设置。
group <groupname> [ <groupname> ]*
执行服务前切换到组<groupname>,此选项默认是root,因此可以不设置
capability [ <capability> ]+
执行服务前设置linux capability,没什么用。
oneshot
服务只启动一次,一旦关闭就不能再启动。
class <name>
为服务指定一个类别,默认为"default",同一类别的服务必须一起启动和停止