[摘]Android初始化語言init.rc語法分析

原文鏈接: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
發佈了30 篇原創文章 · 獲贊 2 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章