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通过jni控制service服务程序的简易流程
  2. Android(安卓)Service AIDL
  3. Android(安卓)命令行编译、打包生成apk文件
  4. Android架构分析之使用自定义硬件抽象层(HAL)模块
  5. android 定位服务
  6. 【安卓笔记】android客户端与服务端交互的三种方式
  7. android手机客户端上传文件,java servlet服务器端接收并保存到服
  8. android 命令(adb shell)进入指定模拟器或设备
  9. android 定位服务

随机推荐

  1. Android(安卓)布局之GridLayout
  2. 2011.07.20——— android 获得当前view
  3. Android(安卓)Framework 基础
  4. Android中的共享设置(SharedPreferences)
  5. Android开发UI之自定义控件的皮肤
  6. Android(安卓)建造者(Builder)模式
  7. Android:res之shape制作圆角、虚线、渐变
  8. MTK Android(安卓)Driver:PMIC
  9. android manifest.xml中元素含义
  10. android 读取sd卡中的图片