init.rc一般位于/根目录下,
转自:http://hi.baidu.com/donghaozheng/blog/item/e2f5045577cb73c8b645aec0.html

Android启动脚本init.rc
2010-05-05 17:13
摘自《Android系统原理及开发要点详解》

Android启动脚本init.rc

在 Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。 init.rc是在init启动后被执行的启动脚本,其语法主要包含了以下内容:

Commands:命令
Actions: 动作
Triggers:触发条件
Services:服务
Options: 选项
Propertise:属性

(1) Commands是一些基本的操作,例如:
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
这些命令在init可执行程序中被解析,然后调用相关的函数来实现。

(2) Actions(动作)表示一系列的命令,通常在Triggers(触发条件)中调用,动作和触发条件的形式为:
on <trigger>
<command>
<command>
<command>

动作的使用示例如下:
on init
export PATH /sbin:/system/sbin:/system/bin:/system/xbin
mkdir /system
init表示一个触发条件,这个触发事件发生后,进行设置环境变量和建立目录的操作称为一个“动作”


(3) Services(服务)通常表示启动一个可执行程序,Options(选项)是服务的附加内容,用于配合服务使用。

service vold /system/bin/vold
socket vold stream 0660 root mount

service bootsound /system/bin/playmp3
user media
group audio
oneshot

vold和bootsound分别是两个服务的名称,/system/bin/vold和/system /bin/playmp3分别是他们所对应的可执行程序。
socket、user、group、oneshot就是配合服务使用的选项。其中oneshot选项表示该服务只启动一次,而如果没有oneshot选项,
这个可执行程序会一直存在--如果可执行程序被杀死,则会重新启动。

(4) Properties(属性)是系统中使用的一些值,可以进行设置和读取。

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脚本的关键字可以参考init进程的system/core/init/keyword.h文件。
init.rc的使用方法,可以参考说明文件system/core/init/readme.txt

如果想要修改启动过程只需要修改init.c(system/core/init)或者init.rc里的内容即可.


附录: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



转自:http://hi.baidu.com/zhlg_hzh/blog/item/4ad24a807c71d3db9023d967.html
Android初始化语言 (init.*.rc、init.conf文件格式)
2010-05-26 16:02
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

更多相关文章

  1. Android 系列之Android 命令行手动编译打包详解
  2. 命令运行 andorid 模拟器
  3. 二、ANDROID命令详解
  4. CMD命令创建、编译Android应用程序
  5. 【Android】选项卡使用
  6. TabHost和TabWidget写出微信下面选项卡的界面
  7. Android Debug Bridge命令介绍

随机推荐

  1. Virtual Keyboards on iPhone and Androi
  2. Android在配置文件中配置Button再不同情
  3. Android(安卓)studio设置资源文件背景及
  4. Android Launcher 启动 Activity 的工作
  5. android 休眠唤醒机制分析— wake_lock
  6. service的生命周期和启动方式
  7. 分享一个Android和java调用RESTful Web服
  8. 编译Android出现/usr/bin/ld: cannot fin
  9. 将程序装到sdcard上
  10. Imageview图片圆形显示