`
阅读更多
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
分享到:
评论

相关推荐

    android系统.rc文件学习包含init.rc,init.usb.rc,init.zygote64.rc,init-debug.rc,ueventd.rc

    Android Init Language是android系统很重要的组成 文件来自于\system\core\rootdir 里面有init.rc,init.usb.rc,init.zygote64.rc,init-debug.rc,ueventd.rc

    init.rc文件解析

    ### Android中的Init.rc文件解析详解 #### 一、引言 `init.rc` 文件作为Android系统启动过程中的关键配置文件之一,在系统初始化阶段扮演着重要角色。它通过一系列的指令来控制系统的启动流程,包括创建目录、挂载...

    把init.rc切换usb模式用脚本替换

    把init.rc切换usb模式用脚本替换, 避免特殊需求对代码修改风险. 附件是展讯7731平台切换到的mtp模式的实现,pid,vid等可以改. 格式为: adb shell ./mtp.sh & #也可以把第一行屏蔽,然后执行./mtp.sh

    10.0 init.rc中data下创建文件节点失败.zip

    在Android系统中,`init.rc` 是一个非常重要的配置文件,它在系统启动时执行一系列初始化任务,包括启动服务、创建文件系统对象等。当我们谈论"10.0 init.rc中data下创建文件节点失败.zip"这个主题时,显然我们关注...

    Android init.rc文件详解

    Android init.rc 文件详解 Android init.rc 文件是 Android 系统的初始化配置文件,负责在系统启动时执行一系列命令和服务来初始化系统环境。该文件以行为单位,由以空格间隔的语言符号组成。每个行为可以包含多个...

    linux系统初始化脚本init.rc的语法介绍.pdf

    Linux 系统初始化脚本 init.rc 语法介绍 init.rc 是 Android 系统初始化脚本,用于控制系统的启动和运行过程。该脚本由四种类型的声明组成:Actions(行动)、Commands(命令)、Services(服务)和 Options(选项...

    Android的初始化语言脚本init.rc解析

    ### Android的初始化语言脚本init.rc解析 #### 概述 `init.rc` 是 Android 系统中的核心初始化脚本,用于定义系统启动时的行为和服务。这个脚本使用了一种特殊的语言来描述启动过程中的各个步骤,包括启动哪些服务...

    Android——init.rc脚本

    在Android系统中,`init.rc`脚本是一个至关重要的组件,它是系统启动过程中最早执行的一批脚本之一,用于初始化系统服务、守护进程以及其他必要的设置。这篇博客文章可能详细介绍了`init.rc`脚本的工作原理及其在...

    Hide init.rc was modified.zip

    标题 "Hide init.rc was modified.zip" 暗示了这个压缩包可能包含了对 Android 系统核心配置文件 `init.rc` 的修改。`init.rc` 文件是 Android 系统启动时执行的重要脚本,用于初始化系统服务和守护进程。在这个场景...

    linux系统初始化脚本init.rc的语法介绍宣贯.pdf

    "Linux系统初始化脚本init.rc的语法介绍" init.rc是Android系统的初始化脚本,它控制着系统的启动过程。在init.rc文件中,我们可以定义各种Actions、Services、Options等元素,以控制系统的行为。本文将详细介绍...

    Android的初始化语言脚本init.rc解析.pdf

    Android 的初始化语言脚本 init.rc 解析 Android 的初始化语言脚本 init.rc 是 Android 操作系统中的一种初始化语言,用于描述 Android 系统的启动过程和初始化操作。init.rc 语言由四大类声明组成:行为类...

    Android init.rc 脚本说明

    ### Android init.rc 脚本详解 在深入探讨Android系统启动流程时,`init.rc`脚本无疑扮演着核心角色。这份脚本是系统初始化过程中第一个被执行的脚本,负责设置系统环境、启动服务以及配置硬件设备。下面,我们将...

    Android-init.rc文件解析过程详解.docx

    Android系统的初始化过程中,`init.rc`文件起着至关重要的作用。它是Android系统启动时执行的第一个脚本,用于配置系统环境、启动服务等。本文将深入解析`init.rc`文件的结构和解析过程。 首先,`init.rc`文件由...

    高通LA.1.1基线android源码init.rc中启动的服务相关流程图

    在Android系统中,init.rc是启动过程中的核心配置文件,它定义了系统启动时的各种服务、守护进程(daemons)以及其他初始化操作。针对高通LA.1.1基线的Android源码,我们来深入探讨init.rc文件中涉及的服务启动流程...

    linux系统初始化脚本init.rc的语法介绍参考.pdf

    Linux系统初始化脚本init.rc的语法介绍参考 本文档主要介绍了Linux系统初始化脚本init.rc的语法结构和相关知识点。 Actions(行为) Actions是init.rc脚本中的一个基本组件,实际上是一个命令序列。每个Actions都...

    Init.rc配置文件Action字段解析

    Parser class Parser { public: // LineCallback is the type for callbacks that can parse a line starting with a given prefix. // // They take the form of bool Callback(std::vector&& args, std::...

    android的init.rc文件的语法

    "Android 的 init.rc 文件的语法" Android 的 init.rc 文件是 Android 系统启动时的初始化脚本文件,它使用 Android 初始化语言(Android Init Language)来定义系统的启动过程。该语言包括四种类型的语句:动作...

    Android init.rc 启动流程图

    Android init.rc 启动流程图 1.ZygoteInit是如何启动的以及如何启动SystemService 2.ActivityManagerService如何通过Zygote来创建Activity Pid 3.命令如何启动Pm.java

    linux系统初始化脚本init.rc的语法介绍借鉴.pdf

    Linux 系统初始化脚本 init.rc 语法介绍 init.rc 是 Android 系统初始化脚本,它包含四种类型的声明:Actions、Commands、Services 和 Options。这些声明都是以行为单位的,使用空格来隔开记号。C 语言风格的反斜杠...

Global site tag (gtag.js) - Google Analytics