Android 的 init.rc 文件的语法详解

Android 的 init.rc 文件的语法详解

http://www.elexcon.com/news/54874.html

  Android初始化语言包含了四种类型的声明:Actions(行动)、 Commands(命令)、Services(服务)和Options(选项)。

  所有这些都是以行为单位的,各种记号由空格来隔开。C语言风格的反斜杠号可用于在记号间插入空格。双引号也可用于防止字符串被空格分割成多个记号。行末的反斜杠用于折行。

  注释行以井号(#)开头(允许以空格开头)。

  Actions和Services声明一个新的分组。所有的命令或选项都属于最近申明的分组。位于第一个分组之前的命令或选项将会被忽略。

  Actions和Services有唯一的名字。如果有重名的情况,第二个申明的将会被作为错误忽略。(???我们是否应该以覆盖来代替忽略)

  Actions(行动)

  ----------

  Actions其实就是一序列的Commands(命令)。Actions都有一个trigger(触发器),它被用于决定action的执行时间。当一个符合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"或"stream"。User 和 group默认为0。

  user 《username》

  在启动这个服务前改变该服务的用户名。此时默认为root。(???有可能的话应该默认为nobody)。当前,如果你的进程要求Linux capabilities(能力),你无法使用这个命令。即使你是root,你也必须在程序中请求capabilities(能力)。然后降到你想要的 uid。

  group 《groupname》 [ 《groupname》 ]*

  在启动这个服务前改变该服务的组名。除了(必需的)第一个组名,附加的组名通常被用于设置进程的补充组(通过setgroups())。此时默认为 root。(???有可能的话应该默认为nobody)。

  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"、"remount"、"noatime"、 ...

  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/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

  调试记录

  在默认情况下,程序在被init执行时会将标准输出和标准错误都重定向到/dev/null(丢弃)。若你想要获得调试信息,你可以通过 Andoird系统中的logwrapper程序执行你的程序。它会将标准输出/标准错误都重定向到Android日志系统(通过logcat访问)。

  例如:

  service akmd /system/bin/logwrapper /sbin/akmd


有了原文,看着翻译的才放心。


附录:system/core/init/readme.txt


Android Init Language
---------------------

The Android Init Language consists of four broad classes of statements,
which are Actions, Commands, Services, and Options.

All of these are line-oriented, consisting of tokens separated by
whitespace. The c-style backslash escapes may be used to insert
whitespace into a token. Double quotes may also be used to prevent
whitespace from breaking text into multiple tokens. The backslash,
when it is the last character on a line, may be used for line-folding.

Lines which start with a # (leading whitespace allowed) are comments.

Actions and Services implicitly declare a new section. All commands
or options belong to the section most recently declared. Commands
or options before the first section are ignored.

Actions and Services have unique names. If a second Action or Service
is declared with the same name as an existing one, it is ignored as
an error. (??? should we override instead)


Actions
-------
Actions are named sequences of commands. Actions have a trigger which
is used to determine when the action should occur. When an event
occurs which matches an action's trigger, that action is added to
the tail of a to-be-executed queue (unless it is already on the
queue).

Each action in the queue is dequeued in sequence and each command in
that action is executed in sequence. Init handles other activities
(device creation/destruction, property setting, process restarting)
"between" the execution of the commands in activities.

Actions take the form of:

on <trigger>
   <command>
   <command>
   <command>


Services
--------
Services are programs which init launches and (optionally) restarts
when they exit. Services take the form of:

service <name> <pathname> [ <argument> ]*
   <option>
   <option>
   ...


Options
-------
Options are modifiers to services. They affect how and when init
runs the service.

critical
   This is a device-critical service. If it exits more than four times in
   four minutes, the device will reboot into recovery mode.

disabled
   This service will not automatically start with its class.
   It must be explicitly started by name.

setenv <name> <value>
   Set the environment variable <name> to <value> in the launched process.

socket <name> <type> <perm> [ <user> [ <group> ] ]
   Create a unix domain socket named /dev/socket/<name> and pass
   its fd to the launched process. <type> must be "dgram" or "stream".
   User and group default to 0.

user <username>
   Change to username before exec'ing this service.
   Currently defaults to root. (??? probably should default to nobody)
   Currently, if your process requires linux capabilities then you cannot use
   this command. You must instead request the capabilities in-process while
   still root, and then drop to your desired uid.

group <groupname> [ <groupname> ]*
   Change to groupname before exec'ing this service. Additional
   groupnames beyond the (required) first one are used to set the
   supplemental groups of the process (via setgroups()).
   Currently defaults to root. (??? probably should default to nobody)

oneshot
   Do not restart the service when it exits.

class <name>
   Specify a class name for the service. All services in a
   named class may be started or stopped together. A service
   is in the class "default" if one is not specified via the
   class option.

onrestart
    Execute a Command (see below) when service restarts.

Triggers
--------
   Triggers are strings which can be used to match certain kinds
   of events and used to cause an action to occur.

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.


Commands
--------

exec <path> [ <argument> ]*
   Fork and execute a program (<path>). This will block until
   the program completes execution. It is best to avoid exec
   as unlike the builtin commands, it runs the risk of getting
   init "stuck". (??? maybe there should be a timeout?)

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.

chdir <directory>
   Change working directory.

chmod <octal-mode> <path>
   Change file access permissions.

chown <owner> <group> <path>
   Change file owner and group.

chroot <directory>
Change process root directory.

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> [mode] [owner] [group]
   Create a directory at <path>, optionally with the given mode, owner, and
   group. If not provided, the directory is created with permissions 755 and
   owned by the root user and root group.

mount <type> <device> <dir> [ <mountoption> ]*
   Attempt to mount the named device at the directory <dir>
   <device> may be of the form mtd@name to specify a mtd block
   device by name.
   <mountoption>s include "ro", "rw", "remount", "noatime", ...

setkey
   TBD

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>

sysclktz <mins_west_of_gmt>
   Set the system clock base (0 if system clock ticks in GMT)

trigger <event>
   Trigger an event. Used to queue an action from another
   action.

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:

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", "restarting")


Example 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/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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值