原文鏈接:http://hi.baidu.com/gaogaf/item/856ecf7634556c295d178974
此文來自於對http://source.android.com/porting/index.html中bring up段的簡譯。其中有一處與源碼的
system/core/init/readme.txt(此文也是對init.rc 的解釋)內容不同:socket <name> <type> <perm> [ <user> [ <group> ] ]
-----------------------------------------------
注1:另外還講述了怎樣輸出log:
Debugging notes
---------------
By default, programs executed by init will drop stdout and stderr into
/dev/null. To help with debugging, you can execute your program via the
Andoird program logwrapper. This will redirect stdout/stderr into the
Android logging system (accessed via logcat).
For example
service akmd /system/bin/logwrapper /sbin/akmd
注2:講述了一個新的命令
sysclktz <mins_west_of_gmt>
Set the system clock base (0 if system clock ticks in GMT)
注3:triggers
boot
This is the first trigger that will occur 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>
device-removed-<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.
------------------------------------------
init 由如下四種類型語句組成:
* Actionn :行爲
* Commands
* Services
* Options
語法(language syntax)結構如下:
* 每一個語句佔據一行,並且各個關鍵字被空格分開。c規範中的(如 \n)反斜槓將被忽略(backslash escapes)而被認爲是一個空格 ,雙引號用來保證空格不會把一個文字串分分爲多個關鍵字。行最後的反斜槓用作續行。
* 由 # (前面允許有空格)開始的行都是註釋行(comment)
* 一個actions 或 services 的開始隱含聲明瞭一個新的段,所有commands 或 options 屬於最近的聲明。在第一個段之前的 commands 或 options 都會被忽略
* 每一個actions 和 services 都有不同的名字。後面與前面發生重名的,那麼這個後面重名的將被忽略或被認爲是一個錯誤
Actions
Actions其實就是一組被命名的命令序列。actions 都有一個觸發條件,觸發條件決定了action何時執行。當一個事件發生如果匹配action的觸發條件,那麼這個action將會被添加到預備執行隊列的尾部(除非它已經在隊列當中)
每一個action中的命令將被順序執行。init進程負責在其它activities(如:設備創建/銷燬,屬性設置,進程重啓)之間執行這些命令序列。
action 的格式如下
on <trigger>
<command>
<command>
<command>
Services
services 是一些由init 啓動 和 重新(如果有需要)啓動的程序,當然這些程序如果是存在的。
services 的格式如下:
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
Options
options 是service的修飾符,用來告訴init 怎樣及何時啓動service。
Option Description
disabled This service will not automatically start with its class. It must be explicitly started by name.
socket <type> <name> <perm> [ <user> [ <group> ] ]
Create a unix domain socket named /dev/socket/<name> and pass its fd to the launched process. Valid <type>dgram and stream. user and group default to 0.(type 實際中是放在name之後)
values include
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
Triggers are strings used to match certain kinds of events that cause an action to occur.
Trigger Description
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>
device-removed-<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 updates some system properties to provide some insight into
what it's doing:
Property Description
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中使用屬性的範例如下:
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
on property:ro.kernel.qemu=1
start adbd
setprop用於設置屬性,on property可以用於判斷屬性,這裏的屬性在整個Android系統運行中都是一致的。
init腳本中的關鍵字可以參考:system/core/init/keywords.h
exam init.rc
---------------------------
on init
sysclktz 0
loglevel 3
# setup the global environment
export PATH /sbin:/system/sbin:/system/bin:/system/xbin:/system/busybox/bin:/system/busybox/sbin:/system/busybox/usr/bin:/system/busybox/usr/sbin
export LD_LIBRARY_PATH /system/lib
export ANDROID_BOOTLOGO 1
export ANDROID_ROOT /system
export ANDROID_ASSETS /system/app
export ANDROID_DATA /data
export EXTERNAL_STORAGE /sdcard
export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar
# Backward compatibility
symlink /system/etc /etc
symlink /sys/kernel/debug /d
# create mountpoints and mount tmpfs on sqlite_stmt_journals
mkdir /sdcard 0000 system system
mkdir /system
mkdir /data 0771 system system
mkdir /cache 0770 system cache
mkdir /config 0500 root root
mkdir /sqlite_stmt_journals 01777 root root
mount tmpfs tmpfs /sqlite_stmt_journals size=4m
#{{ added by FriendlyARM
mkdir /udisk 0000 system system
mkdir /var 0000 system system
mount tmpfs tmpfs /var size=2m
mkdir /var/lock
mkdir /var/run
mkdir /var/log
mount usbfs none /proc/bus/usb -o devmode=0666
chmod 0666 /dev/backlight-1wire
#}}
## mount rootfs rootfs / ro remount
write /proc/sys/kernel/panic_on_oops 1
write /proc/sys/kernel/hung_task_timeout_secs 0
write /proc/cpu/alignment 4
write /proc/sys/kernel/sched_latency_ns 10000000
write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000
write /proc/sys/kernel/sched_compat_yield 1
write /proc/sys/kernel/sched_child_runs_first 0
# Create cgroup mount points for process groups
mkdir /dev/cpuctl
mount cgroup none /dev/cpuctl cpu
chown system system /dev/cpuctl
chown system system /dev/cpuctl/tasks
chmod 0777 /dev/cpuctl/tasks
write /dev/cpuctl/cpu.shares 1024
mkdir /dev/cpuctl/fg_boost
chown system system /dev/cpuctl/fg_boost/tasks
chmod 0777 /dev/cpuctl/fg_boost/tasks
write /dev/cpuctl/fg_boost/cpu.shares 1024
mkdir /dev/cpuctl/bg_non_interactive
chown system system /dev/cpuctl/bg_non_interactive/tasks
chmod 0777 /dev/cpuctl/bg_non_interactive/tasks
# 5.0 %
write /dev/cpuctl/bg_non_interactive/cpu.shares 52
# mount mtd partitions
# Mount /system rw first to give the filesystem a chance to save a checkpoint
## mount yaffs2 mtd@system /system
## mount yaffs2 mtd@system /system ro remount
# We chown/chmod /data again so because mount is run as root + defaults
## mount yaffs2 mtd@userdata /data nosuid nodev
chown system system /data
chmod 0771 /data
# Create dump dir and collect dumps.
# Do this before we mount cache so eventually we can use cache for
# storing dumps on platforms which do not have a dedicated dump partition.
mkdir /data/dontpanic
chown root log /data/dontpanic
chmod 0750 /data/dontpanic
# Collect apanic data, free resources and re-arm trigger
copy /proc/apanic_console /data/dontpanic/apanic_console
chown root log /data/dontpanic/apanic_console
chmod 0640 /data/dontpanic/apanic_console
copy /proc/apanic_threads /data/dontpanic/apanic_threads
chown root log /data/dontpanic/apanic_threads
chmod 0640 /data/dontpanic/apanic_threads
write /proc/apanic_console 1
# Collect ramconsole data
copy /proc/last_kmsg /data/dontpanic/last_kmsg
chown root log /data/dontpanic/last_kmsg
chmod 0640 /data/dontpanic/last_kmsg
# Same reason as /data above
## mount yaffs2 mtd@cache /cache nosuid nodev
chown system cache /cache
chmod 0770 /cache
# This may have been created by the recovery system with odd permissions
chown system system /cache/recovery
chmod 0770 /cache/recovery
#change permissions on vmallocinfo so we can grab it from bugreports
chown root log /proc/vmallocinfo
chmod 0440 /proc/vmallocinfo
# create basic filesystem structure
mkdir /data/misc 01777 system misc
mkdir /data/misc/bluetoothd 0777 bluetooth bluetooth
mkdir /data/misc/keystore 0700 keystore keystore
mkdir /data/misc/vpn 0770 system system
mkdir /data/misc/vpn/profiles 0770 system system
mkdir /data/misc/wifi 0777 wifi wifi
mkdir /data/misc/wifi/sockets 0777 system wifi
chmod 0777 /data/misc/wifi
chmod 0777 /data/misc/wifi/wpa_supplicant.conf
# give system access to wpa_supplicant.conf for backup and restore
chmod 0777 /system/etc/wifi/wpa_supplicant.conf
mkdir /data/misc/dhcp 0770 dhcp dhcp
chown dhcp dhcp /data/misc/dhcp
mkdir /data/local 0771 shell shell
mkdir /data/local/tmp 0771 shell shell
mkdir /data/data 0771 system system
mkdir /data/app-private 0771 system system
mkdir /data/app 0771 system system
mkdir /data/property 0700 root root
# create dalvik-cache and double-check the perms
mkdir /data/dalvik-cache 0771 system system
chown system system /data/dalvik-cache
chmod 0771 /data/dalvik-cache
# create the lost+found directories, so as to enforce our permissions
mkdir /data/lost+found 0770
mkdir /cache/lost+found 0770
# double check the perms, in case lost+found already exists, and set owner
chown root root /data/lost+found
chmod 0770 /data/lost+found
chown root root /cache/lost+found
chmod 0770 /cache/lost+found
#===================================================================
#
# debug fs enable for wifi & bluetooth
#
#===================================================================
mount debugfs none /sys/kernel/debug
on boot
# basic network init
ifup lo
ifup eth0
ifup eth1
hostname localhost
domainname localdomain
# set RLIMIT_NICE to allow priorities from 19 to -20
setrlimit 13 40 40
# Define the oom_adj values for the classes of processes that can be
# killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.BACKUP_APP_ADJ 2
setprop ro.HOME_APP_ADJ 4
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.BACKUP_APP_MEM 4096
setprop ro.HOME_APP_MEM 4096
setprop ro.HIDDEN_APP_MEM 5120
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
#Wifi
# insmod /system/lib/libwifi/lib80211.ko
# insmod /system/lib/libwifi/lib80211_crypt_ccmp.ko
# insmod /system/lib/libwifi/lib80211_crypt_tkip.ko
# insmod /system/lib/libwifi/lib80211_crypt_wep.ko
# insmod /system/lib/modules/2.6.27/kernel/net/bluetooth/bluetooth.ko
# insmod /system/lib/modules/2.6.27/kernel/drivers/bluetooth/hci_uart.ko
# insmod /system/lib/modules/2.6.27/kernel/net/bluetooth/l2cap.ko
# insmod /system/lib/modules/2.6.27/kernel/net/bluetooth/rfcomm/rfcomm.ko
setprop wifi.interface eth1
setprop wlan.interface eth1
setprop wlan.driver.status ok
setprop wlan.modpath /system/lib/libwifi/
setprop wlan.mod1 libertas.ko
setprop wlan.mod2 libertas_sdio.ko
# Write value must be consistent with the above properties.
# Note that the driver only supports 6 slots, so we have HOME_APP at the
# same memory level as services.
write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15
write /proc/sys/vm/overcommit_memory 1
write /proc/sys/vm/min_free_order_shift 4
write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16
# Tweak background writeout
write /proc/sys/vm/dirty_expire_centisecs 200
write /proc/sys/vm/dirty_background_ratio 5
# Permissions for System Server and daemons.
chown radio system /sys/android_power/state
chown radio system /sys/android_power/request_state
chown radio system /sys/android_power/acquire_full_wake_lock
chown radio system /sys/android_power/acquire_partial_wake_lock
chown radio system /sys/android_power/release_wake_lock
chown radio system /sys/power/state
chown radio system /sys/power/wake_lock
chown radio system /sys/power/wake_unlock
chmod 0660 /sys/power/state
chmod 0660 /sys/power/wake_lock
chmod 0660 /sys/power/wake_unlock
chown system system /sys/class/timed_output/vibrator/enable
chown system system /sys/class/leds/keyboard-backlight/brightness
# chown system system /sys/class/leds/lcd-backlight/brightness
chown system system /sys/class/backlight/pwm-backlight/brightness
chown system system /sys/class/leds/button-backlight/brightness
chown system system /sys/class/leds/jogball-backlight/brightness
chown system system /sys/class/leds/red/brightness
chown system system /sys/class/leds/green/brightness
chown system system /sys/class/leds/blue/brightness
chown system system /sys/class/leds/red/device/grpfreq
chown system system /sys/class/leds/red/device/grppwm
chown system system /sys/class/leds/red/device/blink
chown system system /sys/class/leds/red/brightness
chown system system /sys/class/leds/green/brightness
chown system system /sys/class/leds/blue/brightness
chown system system /sys/class/leds/red/device/grpfreq
chown system system /sys/class/leds/red/device/grppwm
chown system system /sys/class/leds/red/device/blink
chown system system /sys/class/timed_output/vibrator/enable
chown system system /sys/module/sco/parameters/disable_esco
chown system system /sys/kernel/ipv4/tcp_wmem_min
chown system system /sys/kernel/ipv4/tcp_wmem_def
chown system system /sys/kernel/ipv4/tcp_wmem_max
chown system system /sys/kernel/ipv4/tcp_rmem_min
chown system system /sys/kernel/ipv4/tcp_rmem_def
chown system system /sys/kernel/ipv4/tcp_rmem_max
chown root radio /proc/cmdline
#bluetooth power up/down interface
# chown bluetooth bluetooth /sys/class/rfkill/rfkill0/type
# chown bluetooth bluetooth /sys/class/rfkill/rfkill0/state
# chmod 0660 /sys/class/rfkill/rfkill0/state
# chown bluetooth bluetooth /dev/s3c2410_serial1
chmod 0666 /dev/s3c2410_serial1
chmod 0666 /dev/s3c2410_serial2
chmod 0666 /dev/s3c2410_serial3
chmod 0666 /dev/video0
chmod 0666 /dev/s3c-jpg
# Define TCP buffer sizes for various networks
# ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax,
setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208
setprop net.tcp.buffersize.wifi 4095,87380,110208,4096,16384,110208
setprop net.tcp.buffersize.umts 4094,87380,110208,4096,16384,110208
setprop net.tcp.buffersize.edge 4093,26280,35040,4096,16384,35040
setprop net.tcp.buffersize.gprs 4092,8760,11680,4096,8760,11680
setprop net.dns1 8.8.8.8
setprop net.dns2 8.8.4.4
class_start default
setprop alsa.mixer.playback.master Front
setprop alsa.mixer.capture.master Capture
setprop alsa.mixer.playback.earpiece Master
setprop alsa.mixer.capture.earpiece Capture
setprop alsa.mixer.playback.headset Master
setprop alsa.mixer.playback.speaker Master
## Daemon processes to be run by init.
##
service console /system/bin/sh
#service console /system/busybox/bin/ash
console
# adbd is controlled by the persist.service.adb.enable system property
service adbd /sbin/adbd
disabled
# adbd on at boot in emulator
on property:ro.kernel.qemu=1
start adbd
on property:persist.service.adb.enable=1
start adbd
on property:persist.service.adb.enable=0
stop adbd
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart restart media
service vold /system/bin/vold
socket vold stream 0660 root mount
service tsd /sbin/tsd
service nexus /system/bin/nexus
socket nexus stream 0660 root system
disabled
#service mountd /system/bin/mountd
# socket mountd stream 0660 root mount
service debuggerd /system/bin/debuggerd
service udiskd /system/bin/udiskd
socket udiskd stream 666 root mount
service fanetworkservice /system/bin/fa-network-service
socket fa-network-service stream 666 radio radio
user root
group radio cache inet misc audio
#user radio
#group radio cache inet misc audio
service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so -- -d /dev/pts/0
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
user root
group radio cache inet misc audio
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
service media /system/bin/mediaserver
user media
group system audio camera graphics inet net_bt net_bt_admin
##service bootsound /system/bin/playmp3
## user media
## group audio
## oneshot
service bootanim /system/bin/bootanimation
user graphics
group graphics
disabled
oneshot
service dbus /system/bin/dbus-daemon --system --nofork
socket dbus stream 660 bluetooth bluetooth
user bluetooth
group bluetooth net_bt_admin
service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant -Dwext -ieth1 -c /system/etc/wifi/wpa_supplicant.conf -dd
group system wifi inet keystore
disabled
oneshot
service dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d eth1
disabled
oneshot
group system dhcp
on property:init.svc.wpa_supplicant=stopped
stop dhcpcd
service bluetoothd /system/bin/logwrapper /system/bin/bluetoothd -d -n
socket bluetooth stream 660 bluetooth bluetooth
socket dbus_bluetooth stream 660 bluetooth bluetooth
# init.rc does not yet support applying capabilities, so run as root and
# let bluetoothd drop uid to bluetooth with the right linux capabilities
group bluetooth net_bt_admin misc
disabled
# baudrate change 115200 to 1152000(Bluetooth)
service changebaudrate /system/bin/logwrapper /system/xbin/bccmd_115200 -t bcsp -d /dev/s3c2410_serial1 psset -r 0x1be 0x126e
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
#service hciattach /system/bin/logwrapper /system/bin/hciattach -n -s 1152000 /dev/s3c2410_serial1 bcsp 1152000
service hciattach /system/bin/logwrapper /system/bin/hciattach -n -s 115200 /dev/s3c2410_serial1 bcsp 115200
user bluetooth
group bluetooth net_bt_admin misc
disabled
service hfag /system/bin/sdptool add --channel=10 HFAG
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service hsag /system/bin/sdptool add --channel=11 HSAG
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service opush /system/bin/sdptool add --channel=12 OPUSH
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service pbap /system/bin/sdptool add --channel=19 PBAP
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service installd /system/bin/installd
socket installd stream 600 system system
##service flash_recovery /system/etc/install-recovery.sh
## oneshot
service racoon /system/bin/racoon
socket racoon stream 600 system system
# racoon will setuid to vpn after getting necessary resources.
group net_admin
disabled
oneshot
service mtpd /system/bin/mtpd
socket mtpd stream 600 system system
user vpn
group vpn net_admin net_raw
disabled
oneshot
service keystore /system/bin/keystore /data/misc/keystore
user keystore
group keystore
socket keystore stream 666
service dumpstate /system/bin/dumpstate -s
socket dumpstate stream 0660 shell log
disabled
oneshot
================================================================================
Android初始化語言 (init.*.rc、init.conf文件格式)
Android初始化語言包含了四種類型的聲明:Actions (行動)、Commands (命令)、Services (服務)和Options (選項)。
所有這些都是以行爲單位的,各種記號由空格來隔開。C語言風格的反斜槓號可用於在記號間插入空格。雙引號也可用於防止字符串被空格分割成多個記
註釋行以井號(#)開頭(允許以空格開頭)。
Actions和Services聲明一個新的分組。所有的命令或選項都屬於最近申明的分組。位於第一個分組之前的命令或選項將會被忽略。
Actions和Services有唯一的名字。如果有重名的情況,第二個申明的將會被作爲錯誤忽略。( ???我們是否應該以覆蓋來代替忽略)
Actions (行動)
----------
Actions其實就是一序列的Commands (命令)。Actions都有一個trigger (觸發器),它被用於決定action的執行時間。當一個符合action觸發條
隊列中的每一個action都被依次提取出,而這個action中的每個command (命令)都將被依次執行。Init在這些命令的執行期間還控制着其他的活動(
Actions的形式如下:
on <trigger>
<command>
<command>
<command>
Services (服務)
----------
Services (服務)是一個程序,他在初始化時啓動,並在退出時重啓(可選)。Services (服務)的形式如下:
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
Options (選項)
----------
Options (選項)是一個Services (服務)的修正者。他們影響Services (服務)在何時,並以何種方式運行。
critical (關鍵)
說明這是一個對於設備關鍵的服務。如果他四分鐘內退出大於四次,系統將會重啓並進入 recovery (恢復)模式。
disabled (失效)
說明這個服務不會同與他同trigger (觸發器)下的服務自動啓動。他必須被明確的按名啓動。
setenv <name> <value> (設置環境變量)
在進程啓動時將環境變量<name>設置爲<value>。
socket <name> <type> <perm> [ <user> [ <group> ] ]
創建一個Uinx域的名爲/dev/socket/<name> 的套接字,並傳遞它的文件描述符給已啓動的進程。<type> 必須是 "dgram"或"
user <username>
在啓動這個服務前改變該服務的用戶名。此時默認爲 root。(???有可能的話應該默認爲nobody)。當前,如果你的進程要求L
group <groupname> [ <groupname> ]*
在啓動這個服務前改變該服務的組名。除了(必需的)第一個組名,附加的組名通常被用於設置進程的補充組(通過setgroups()
oneshot
服務退出時不重啓。
class <name>
指定一個服務類。所有同一類的服務可以同時啓動和停止。如果不通過class選項指定一個類,則默認爲"default"類服務。
onrestart
當服務重啓,執行一個命令(下詳)。
Triggers (觸發器)
----------
Triggers (觸發器)是一個用於匹配特定事件類型的字符串 ,用於使Actions (行動)發生。
boot
這是init執行後的第一個被觸發的Triggers (觸發器)。(在 /init.conf (啓動配置文件)被裝載之後)
<name>=<value>
這種形式的Triggers (觸發器)會在屬性<name>被設置爲指定的<value>時被觸發。
device-added-<path>
device-removed-<path>
這種形式的Triggers (觸發器)會在一個設備節點文件被增刪時觸發。
service-exited-<name>
這種形式的Triggers (觸發器)會在一個特定的服務退出時觸發。
Commands (命令)
----------
exec <path> [ <argument> ]*
創建和執行一個程序(<path>)。在程序完全執行前,init將會阻塞。由於它不是內置命令,應儘量避免使用exec ,它可能會引起init卡
export <name> <value>
在全局環境變量中設在環境變量 <name>爲<value>。(這將會被所有在這命令之後運行的進程所繼承)
ifup <interface>
啓動網絡接口<interface>
import <filename>
解析一個init配置文件,擴展當前配置。
hostname <name>
設置主機名。
chmod <octal-mode> <path>
更改文件訪問權限。
chown <owner> <group> <path>
更改文件的所有者和組。
class_start <serviceclass>
啓動所有指定服務類下的未運行服務。
class_stop <serviceclass>
停止指定服務類下的所有已運行的服務。
domainname <name>
設置域名。
insmod <path>
加載<path>中的模塊。
mkdir <path> [mode] [owner] [group]
創建一個目錄<path> ,可以選擇性地指定mode、owner以及group。如果沒有指定,默認的權限爲755 ,並屬於root用戶和 root組。
mount <type> <device> <dir> [ <mountoption> ]*
試圖在目錄<dir>掛載指定的設備。<device> 可以是以 mtd@name 的形式指定一個mtd塊設備。<mountoption>包括 "ro"、"rw"、"re
setkey
待完成 ...... (暫時不可用)
setprop <name> <value>
設置系統屬性 <name> 爲 <value>值 .
setrlimit <resource> <cur> <max>
設置<resource>的rlimit (資源限制)。
start <service>
啓動指定服務(如果此服務還未運行)。
stop <service>
停止指定服務(如果此服務在運行中)。
symlink <target> <path>
創建一個指向<path>的軟連接<target>。
sysclktz <mins_west_of_gmt>
設置系統時鐘基準(0代表時鐘滴答以格林威治平均時(GMT)爲準)
trigger <event>
觸發一個事件。用於將一個action與另一個 action排列。(?????)
write <path> <string> [ <string> ]*
打開路徑爲<path>的一個文件,並寫入一個或多個字符串。
Properties (屬性)
----------
Init更新一些系統屬性以提供對正在發生的事件的監控能力 :
init.action
此屬性值爲正在被執行的action的名字,如果沒有則爲""。
init.command
此屬性值爲正在被執行的command的名字,如果沒有則爲""。
init.svc.<name>
名爲<name>的service的狀態("stopped" (停止), "running" (運行), "restarting" (重啓))
init.conf實例
-----------------
# not complete -- just providing some examples of usage
#
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/cp /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
調試記錄
---------------
在默認情況下,程序在被init執行時會將標準輸出和標準錯誤都重定向到/dev/null (丟棄)。若你想要獲得調試信息,你可以通過Andoird系統中的logwrapp
例如:
service akmd /system/bin/logwrapper /sbin/akmd