Android 初始化語言(Android Init Language)
Android初始化腳本語言包含四種類型的語句:
- 動作(Actions)
- 指令(Commands)
- 服務(Services)
- 選項(Options)
該語言的語法包括下列約定:
- 所有類型的語句都是基於行(line-oriented)的, 一個語句包含若干個tokens,token之間通過空格字元分隔. 如果一個token中需要包含空格字元,則需要通過C語言風格的反斜線('\')來轉義,或者使用雙引號把整個token引起來。反斜線還可以出現在一行 的末尾,表示下一行的內容仍然屬於當前語句。
- 以'#'開始的行是注釋行。
- 動作(Actions)和服務(Services)語句隱含表示一個新的段落(section)的開始。 所有的指令(commands)和選項()歸屬于上方最近的一個段落。在第一個段落之前的指令(commands)和選項()是無效的。
- 動作(Actions)和服務(Services)擁有唯一性的名字。如果出現重名,那麼後出現的定義將被作為錯誤忽略掉。
動作(Actions)
動作(Actions)是一個有名字的指令(commands)序列。每個動作 (Actions)都定義一個觸發條件(trigger),用於指示什麼時候執行這個動作。當與動作的觸發器匹配的事件發生時,該動作將被添加到一個即將 被執行的佇列的隊尾(除非它已經在佇列中)。
佇列中的每一個動作被依次取出執行,動作中的每一個指令也將依次執行。初始化程式(Init)在執行一個動作的各項指令的期間,還需要處理其他操作(比如,設備創建/銷毀,屬性設置,進程重啟)。
一個動作定義的形式如下:
on <trigger>
<command>
<command>
<command>
服務(Services)
服務是初始化程式需要啟動的一些程式,初始化程式還有可能會在這些程式退出之後重啟它們。Services take 一個服務定義的形式如下:
service <name> <pathname>
[ <argument> ]*
<option>
<option>
...
選項(Options)
選項將影響控制初始化程式運行服務的時機和方法。可能的選項如下表。
選項 |
說明 |
disabled |
This service will not automatically start with its class. It must be explicitly started by name. |
socket <name><type> <perm> [ <user> [ <group> ] ] |
Create a unix domain socket named /dev/socket/<name> and pass its fd to the launched process. Valid <type> values include dgram and stream. user and groupdefault to 0. |
user <username> |
Change to username before exec'ing this service. Currently defaults to root. |
group <groupname> [ <groupname> ]* |
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 [ <capability> ]+ |
Set linux capability before exec'ing this service |
oneshot |
Do not restart the service when it exits. |
class <name> |
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). |
<name>=<value> |
Triggers of this form occur when the property <name> is set to the specific value <value>. |
device-added-<path> |
Triggers of these forms occur when a device node is added or removed. |
service-exited-<name> |
Triggers of this form occur when the specified service exits. |
指令(Commands)
Command |
Description |
exec <path> [ <argument> ]* |
Fork and execute a program (<path>). 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 <name> <value> |
Set the environment variable <name> equal to <value> in the global environment (which will be inherited by all processes started after this command is executed). |
ifup <interface> |
Bring the network interface <interface> online. |
import <filename> |
Parse an init config file, extending the current configuration. |
hostname <name> |
Set the host name. |
class_start <serviceclass> |
Start all services of the specified class if they are not already running. |
class_stop <serviceclass> |
Stop all services of the specified class if they are currently running. |
domainname <name> |
Set the domain name. |
insmod <path> |
Install the module at <path>. |
mkdir <path> |
Make a directory at <path>. |
mount <type> <device> <dir> [ <mountoption> ]* |
Attempt to mount the named device at the directory <dir> <device>. This may be of the form mtd@name to specify a mtd block device by name. |
setkey |
- currenlty undefined - |
setprop <name> <value> |
Set system property <name> to <value>. |
setrlimit <resource> <cur> <max> |
Set the rlimit for a resource. |
start <service> |
Start a service running if it is not already running. |
stop <service> |
Stop a service from running if it is currently running. |
symlink <target> <path> |
Create a symbolic link at <path> with the value <target>. |
write <path> <string> [ <string> ]* |
Open the file at <path> 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.<name> |
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
留言列表