气质,源于心灵的自信!
全部博文(204)
分类: LINUX
2013-03-29 16:42:54
原文地址:Android 初始化脚本语法解析 作者:amuhong
Android初始化脚本语言包含四种类型的语句:
该语言的语法包括下列约定:
动作(Actions)是一个有名字的指令(commands)序列。每个动作(Actions)都定义一个触发条件(trigger),用于指示 什么时候执行这个动作。当与动作的触发器匹配的事件发生时,该动作将被添加到一个即将被执行的队列的队尾(除非它已经在队列中)。
队列中的
每一个动作被依次取出执行,动作中的每一个指令也将依次执行。初始化程序(Init)在执行一个动作的各项指令的期间,还需要处理其它操作(比如,设备创
建/销毁,属性设置,进程重启)。
一个动作定义的形式如下:
on
服务(Services)
服务是初始化程序需要启动的一些程序,初始化程序还有可能会在这些程序退出之后重启它们。Services take 一个服务定义的形式如下:service[ ]*
选项(Options)
选项将影响控制初始化程序运行服务的时机和方法。可能的选项如下表。
| 选项 | 说明 |
disabled |
This service will not automatically start with its class. It must be explicitly started by name. |
socket |
Create a unix domain socket named /dev/socket/
and pass its fd to the launched process. Valid
values include dgram and stream. user
and group default to 0. |
user |
Change to username before exec'ing this service. Currently defaults to root. |
group |
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 setgroups()).
Currently defaults to root. |
capability [ |
Set linux capability before exec'ing this service |
oneshot |
Do not restart the service when it exits. |
class |
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)的执行。
| 触发器 | 说明 |
boot |
This is the first trigger that occurs when init starts (after /init.conf
is loaded). |
|
Triggers of this form occur when the property
is set to the specific value . |
device-added- |
Triggers of these forms occur when a device node is added or removed. |
service-exited- |
Triggers of this form occur when the specified service exits. |
指令(Commands)
| Command | Description |
exec |
Fork and execute a program (). This
will block until the program completes execution. Try to avoid exec.
Unlike the builtin commands, it runs the risk of getting
init "stuck". |
export |
Set the environment variable equal
to in the global environment (which will be
inherited by all processes started after this command is executed). |
ifup |
Bring the network interface
online. |
import |
Parse an init config file, extending the current configuration. |
hostname |
Set the host name. |
class_start |
Start all services of the specified class if they are not already running. |
class_stop |
Stop all services of the specified class if they are currently running. |
domainname |
Set the domain name. |
insmod |
Install the module at . |
mkdir |
Make a directory at . |
mount |
Attempt to mount the named device at the directory
. This may be of the form mtd@name
to specify a mtd block device by name. |
setkey |
- currenlty undefined - |
setprop |
Set system property to . |
setrlimit |
Set the rlimit for a resource. |
start |
Start a service running if it is not already running. |
stop |
Stop a service from running if it is currently running. |
symlink |
Create a symbolic link at with the
value . |
write |
Open the file at and write one or
more strings to it with write(2). |
属性(Properties)
初始化程序(Init)可以根据需要修改一些系统的属性。| 属性 | 说明 |
init.action |
Equal to the name of the action currently being executed or "" if none. |
init.command |
Equal to the command being executed or "" if none. |
init.svc. |
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