android的init.rc文件的语法
android的启动脚本(init.rc)文件的语法,参考资料:
http://www.kandroid.org/android_pdk/bring_up.html
Android初始化脚本语言包含四种类型的语句:
· 动作(Actions)
· 指令(Commands)
· 服务(Services)
· 选项(Options)
该语言的语法包括下列约定:
· 所有类型的语句都是基于行(line-oriented)的, 一个语句包含若干个tokens,token之间通过空格字符分隔. 如果一个token中需要包含空格字符,则需要通过C语言风格的反斜线('/')来转义,或者使用双引号把整个token引起来。反斜线还可以出现在一行的末尾,表示下一行的内容仍然属于当前语句。
· 以'#'开始的行是注释行。
· 动作(Actions)和服务(Services)语句隐含表示一个新的段落(section)的开始。 所有的指令(commands)和选项(options)归属于上方最近的一个段落。在第一个段落之前的指令(commands)和选项(options)是无效的。
· 动作(Actions)和服务(Services)拥有唯一性的名字。如果出现重名,那么后出现的定义将被作为错误忽略掉。
动作(Actions)
动作(Actions)是一个有名字的指令(commands)序列。每个动作(Actions)都定义一个触发条件(trigger),用于指示什么时候执行这个动作。当与动作的触发器匹配的事件发生时,该动作将被添加到一个即将被执行的队列的队尾(除非它已经在队列中)。
队列中的每一个动作被依次取出执行,动作中的每一个指令也将依次执行。初始化程序(Init)在执行一个动作的各项指令的期间,还需要处理其它操作(比如,设备创建/销毁,属性设置,进程重启)。
一个动作定义的形式如下:
on
服务(Services)
服务是初始化程序需要启动的一些程序,初始化程序还有可能会在这些程序退出之后重启它们。Services take 一个服务定义的形式如下:
service [ ]*
选项(Options)
选项将影响控制初始化程序运行服务的时机和方法。可能的选项如下表。
选项 |
说明 |
|
This service will not automatically start with its class. It must be explicitly started by name. |
|
Create a unix domain socket named |
|
Change to username before exec'ing this service. Currently defaults to root. |
|
Change to groupname before exec'ing this service. Additional groupnames beyond the first, which is required, are used to set additional groups of the process (with |
|
Set linux capability before exec'ing this service |
|
Do not restart the service when it exits. |
|
Specify a class name for the service. All services in a named class must start and stop together. A service is considered of class "default" if one is not specified via the class option. |
触发器(Triggers)
触发器是一个字符串,用于匹配特定的事件,这些事件将触发触发器所属动作(Actions)的执行。
|
|
触发器 |
说明 |
|
This is the first trigger that occurs when init starts (after |
|
Triggers of this form occur when the property |
|
Triggers of these forms occur when a device node is added or removed. |
|
Triggers of this form occur when the specified service exits. |
指令(Commands)
Command |
Description |
|
Fork and execute a program ( |
|
Set the environment variable |
|
Bring the network interface |
|
Parse an init config file, extending the current configuration. |
|
Set the host name. |
|
Start all services of the specified class if they are not already running. |
|
Stop all services of the specified class if they are currently running. |
|
Set the domain name. |
|
Install the module at |
|
Make a directory at |
|
Attempt to mount the named device at the directory |
|
- currenlty undefined - |
|
Set system property |
|
Set the rlimit for a resource. |
|
Start a service running if it is not already running. |
|
Stop a service from running if it is currently running. |
|
Create a symbolic link at |
|
Open the file at |
属性(Properties)
初始化程序(Init)可以根据需要修改一些系统的属性。
属性 |
说明 |
|
Equal to the name of the action currently being executed or "" if none. |
|
Equal to the command being executed or "" if none. |
|
State of a named service ("stopped", "running", or "restarting"). |
init.rc文件示例
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys
write /proc/cpu/alignment 4
ifup lo
hostname localhost
domainname localhost
mount yaffs2 mtd@system /system
mount yaffs2 mtd@userdata /data
import /system/etc/init.conf
class_start default
service adbd /sbin/adbd
user adb
group adb
service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666
service runtime /system/bin/runtime
user system
group system
on device-added-/dev/compass
start akmd
on device-removed-/dev/compass
stop akmd
service akmd /sbin/akmd
disabled
user akmd
group akmd