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

来源:互联网 发布:领航员监控软件 编辑:程序博客网 时间:2024/06/07 11:11

原文链接: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
0 0
原创粉丝点击