一、 init.rc 中包含的四种语法:
1、 动作(Action)
2、 命令(Commands)
3、 服务(Services)
4、 选项(Options)
二、 init.rc 语法使用:
1、 Action 和 Commands 一起使用,形式如下
on <trigger>
<command>
<command>
<command>
其中trigger是触发条件,也就是说在满足触发条件的情况下执行1个或多个相应的命令,举例如下:
onproperty:persist.service.adb.enable=1
start adbd
动作触发条件:
1) early-init、Init、early-boot、boot
初始化开始(载入配置文件)的时候触发
2)<name>=<value>
当名为<name>的属性(property)的值为<value>的时候触发。
只要属性一改变就会被触发,然后执行相应的命令:
所以如果在终端下输入:
setprop property:persist.service.adb.enable 1或者0
那么将会开启或者关闭adbd 程序。
命令(Command)的形式:
1) exec <path> [ <argument> ]*
复制(fork)和执行路径为<path>的应用程序,<argument>为该应用程序的参数,在该应用程序执行完前,此命令(Command)会屏蔽
2) export <name> <value>
声明名为<name>的环境变量的值为<value>,声明的环境变量是系统环境变量,启动后一直有效。
3) ifup <interface>
启动名为<interface>的网络接口
4) import <filename>
加入新的位置文件,扩展当前的配置。
5) hostname <name>
设置主机名
6)sysclktz<mins_west_of_gmt>
设置系统时区(GMT为0)
7) class_start<serviceclass>
启动指定类别的所有服务
8) class_stop <serviceclass>
停止指定类别的所有服务
9) domainname <name>
设置域名
10) insmod <path>
加载路径为<path>的内核模块
11) mkdir <path>
创建路径为<path>目录
12) mount <type> <device> <dir> [<mountoption> ]*
挂载类型为<type>的设备<device>到目录<dir>,<mountoption>为挂载参数,举例如下:
mount ubifs ubi1_0/data nosuid nodev
13) setprop <name> <value>
设置名为<name>的系统属性的值为<value>
14) setrlimit <resource> <cur> <max>
设置资源限制,
15) start <service>
启动服务(如果服务未运行)
16) stop <service>
停止服务(如果服务正在运行)
17) symlink <target> <path>
创建一个从<path>指向<target>的符号链接,举例:
symlink /system/etc/etc
18) write <path> <string> [<string> ]*
打开路径为<path>的文件并将一个多这多个字符串写入到该文件中。
19)在代码中start/stop某个service
property_set("ctl.start",ServiceName);就是启动ServiceName服务(在init.rc中定义);
property_set("ctl.stop",ServiceName)相对的是关闭ServiceName服务。
比如:开机动画就是在surfaceFlinger中启动的:
property_set("ctl.start","bootanim");
2、 Services 和Options 一起使用,形式如下
service <name> <pathname> [<argument> ]*
<option>
<option>
上面内容解释为:
service 服务名称 服务对应的命令的路径 命令的参数
选项
选项
...
举例如下:
service vold/system/bin/vold
socket vold stream0660 root mount
service bootsound/system/bin/playmp3
user media
group audio
oneshot
vold和bootsound分别是两个服务的名称,/system/bin/vold和/system /bin/playmp3分别是他们所对应的可执行程序。
socket、user、group、oneshot就是配合服务使用的选项。其中oneshot选项表示该服务只启动一次,而如果没有oneshot选项,
这个可执行程序会一直存在--如果可执行程序被杀死,则会重新启动。
选项是影响服务启动和运行的参数,主要的选项如下:
1) disabled:禁用服务,此服务开机时不会自动启动,但是可以在应用程序中手动启动它。
2) socket:
socket <type> <name> <perm> [<user> [ <group> ] ]
套接字 类型 名称 权限 用户 组
创建一个名为/dev/socket/<name>,然后把它的fd传给启动程序
类型type的值为dgram或者stream
perm表示该套接字的访问权限,user和group表示改套接字所属的用户和组,这两个参数默认都是0,因此可以不设置。
如adbd服务:
service adbd /sbin/adbd
class core
socket adbd stream 660 system system
3) user:
user <username>
执行服务前切换到用户<username>,此选项默认是root,因此可以不设置。
4) group:
group <groupname> [ <groupname> ]*
执行服务前切换到组<groupname>,此选项默认是root,因此可以不设置
5) oneshot:
服务只启动一次,一旦关闭就不能再启动。
6) class:
class <name>
为服务指定一个类别,默认为"default",同一类别的服务必须一起启动和停止
7) critical:
这是一个设备关键服务(device-critical service) . 如果它在4 分钟内退出超过4 次,设备将重启并进入恢复模式。
三、 init.rc 执行顺序:(参考 system/core/init/init.c 代码)
1、 on early-init
2、 init.c queue_builtin_action()
wait_for_coldboot_done
keychord_init
console_init
3、 on init
4、 on early-fs
5、 on fs
6、 on post-fs
7、 on post-fs-data
8、 init.c queue_builtin_action()
property_service_init
signal_init
check_startup
9、 on early-boot
10、 on boot
四、init.rc 执行的关键动作
1、 执行on early-init
a) write /proc/1/oom_adj -16 #设置oom_adj
b) start ueventd
c) mkdir /mnt 0775 root system
2、 执行on init
a) sysclktz 0 #设置GMT(格林尼治时间),中国式GMT +8
b) loglevel 3 #ERROR级别的输出,eclipse中的DDMS也可以调整
#define KLOG_ERROR(tag,x...) klog_write(3, "<3>" tag ": " x)
#define KLOG_WARNING(tag,x...) klog_write(4,"<4>" tag ": " x)
#define KLOG_NOTICE(tag,x...) klog_write(5, "<5>" tag ": " x)
#define KLOG_INFO(tag,x...) klog_write(6, "<6>" tag ": " x)
#define KLOG_DEBUG(tag,x...) klog_write(7, "<7>" tag ": " x)
c) export全局变量
d) 创建根目录文件夹
mkdir/system
mkdir/data 0771 system system
mkdir /cache 0770 system cache
3、 执行on fs
加载系统ko
insmod /system/lib/modules/***.ko
4、 执行on post-fs
Mount 文件系统
mount rootfs rootfs / shared rec
5、 执行on post-fs-data
初始化/data/分区目录结构
chown system system /data
chmod 0771 /data
6、 执行on boot
启动 core/main类型的服务
class_start core
class_start main
7、 启动core类型service
1) service ueventd /sbin/ueventd
2) service console /system/bin/sh #option disable:启动时不执行
3) service adbd /sbin/adbd #option disable:启动时不执行
4) service servicemanager/system/bin/servicemanager
5) service vold /system/bin/vold
8、 启动main类型 service
1) service displayd /system/bin/displayd
2) service netd /system/bin/netd
3) service debuggerd /system/bin/debuggerd
4) service surfaceflinger/system/bin/surfaceflinger
5) service zygote /system/bin/app_process -Xzygote/system/bin --zygote --start-system-server
6) service drm /system/bin/drmserver
7) service media /system/bin/mediaserver
8) service bootanim /system/bin/bootanimation
9) service installd /system/bin/installd
10) service flash_recovery/system/etc/install-recovery.sh
11) service sshd /system/bin/start-ssh
参考:http://blog.csdn.net/zhenwenxian/article/details/7506392
http://blog.csdn.net/kickxxx/article/details/7590665