由于工作的需要,今天研究了Android的启动脚本–init.rc

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

我们可以通过修改init.rc脚本来修改启动过程。但是,一般情况下,我们不直接修改init.rc,而是在文件 init.%PRODUCT%.rc文件中添加或修改我们需要的额外的初始化配置。因为init.c中的main函数在解析完init.rc以后会继续解 析init.%PRODUCT%.rc文件。要特别强调的是,init.rc文件和init.%PRODUCT%.rc文件都是用Android Init Language语言来编写的。

Android Init Language由四种类别的语句组成:Actions、Commands、Services、Options。

–Actions–
Actions是一系列命令的命名。Actions拥有一个触发器(trigger)用来决定action何时执行。当一个action在符合触发条件被执行时,如果它还没被加入到待执行队列中的话,则加入到队列最后。
队列中的action依次执行,action中的命令也依次执行。Init在执行命令的中间处理其它活动(设备创建/销毁,property设置,进程重启)。
Actions表现形式为:
on <trigger>
<command>
<command>
<command>

–Services–
Services是由init启动,在它们退出时重启(可选)。Service表现形式为:
service <name> <pathname> [ <argument> ]*
<option>
<option>

–Options–
Options是Services的修饰,它们影响init何时、如何运行service。

critical
这是一个设备关键服务(device-critical service) 。如果它在4分钟内退出超过4次,设备将重启并进入恢复模式。

disabled
这个服务的级别将不会自动启动,它必须被依照服务名指定启动才可以启动。

setenv <name> <value>
设置已启动的进程的环境变量<name>的值<value>。

socket <name> <type> <perm> [ <user> [ <group> ] ]
创建一个名为/dev/socket/<name>的unix domin socket,并传送它的fd到已启动的进程。<type>必须为”dgram”或”stream”。用户和组默认为0。

user <username>
在执行服务前改变用户名。当前默认为root。如果你的进程需要linux能力,你不能使用这个命令。你必须在还是root时请求能力,并下降到你需要的uid。

group <groupname> [ <groupname> ]*
在执行服务前改变组。在第一个组后的组将设为进程附加组(通过setgroups())。当前默认为root。

oneshot
在服务退出后不重启。

class <name>
为service指定一个类别名。同样类名的所有的服务可以一起启动或停止。如果没有指定类别的服务默认为”default”类。

onrestart
当服务重启时执行一个命令。

–Triggers–
Triggers(触发器)是一个字符串,可以用来匹配某种类型的事件并执行一个action。

boot
这是当init开始后执行的第一个触发器(当/init.conf被加载)。

<name>=<value>
当property <name>被设为指定的值<value>时触发。

device-added-<path>
device-removed-<path>
当设备节点被添加或移除时触发。

service-exited-<name>
当指定的服务存在时触发。

–Commands–

exec <path> [ <argument> ]*
Fork并执行一个程序(<path>)。这将被block直到程序执行完毕。最好避免执行例如内建命令以外的程序,它可能会导致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>创建一个目录,可选选项:mod、owner、group。如果没有指定,目录以755权限,owner为root,group为root创建。

mount <type> <device> <dir> [ <mountoption> ]*
尝试mount <device>到目录<dir>。<device>可以用mtd@name 格式以命名指定一个mtd块设备。<mountoption>包含”ro”,”rw”,”remount”,”noatime”。

setkey
暂时没有。

setprop <name> <value>
设置系统property <name>的值<value>。

setrlimit <resource> <cur> <max>
设置resource的rlimit。

start <service>
启动一个没有运行的服务。

stop <service>
停止一个正在运行的服务。

symlink <target> <path>
创建一个<path>的符号链接到<target>。

sysclktz <mins_west_of_gmt>
设置系统时区(GMT为0)。

trigger <event>
触发一个事件。用于调用其它action。

write <path> <string> [ <string> ]*
打开<path>的文件并写入一个或多个字符串。

–Properties–
Init会更新一些系统property以提供查看它正在干嘛。

init.action
当前正在执行的action,如果没有则为”"。

init.command
被执行的命令,如果没有则为”"。

init.svc.<name>
命名为<name>的服务的状态(“stopped”,”running”, “restarting”)。

有关Android Init Language的关键字的说明,请参看文件:$GINGERBREAD/system/core/init/keyword.h
有关Android Init Language的说明,请参看文件:$GINGERBREAD/system/core/init/readme.txt

参考书:《Android系统原理及开发要点详解》
参考博文:
http://blog.csdn.net/yangxinle137/archive/2011/03/07/6228408.aspx
http://home.lupaworld.com/home-space-uid-42237-do-blog-id-230897.html

更多相关文章

  1. android studio中常用的导入jar包以及添加远程依赖的方式
  2. Android(安卓)下基于core文件分析crash信息
  3. android 环境下使用cocos2d-x的环境配置步骤
  4. RN-修改安卓项目名字
  5. Android(安卓)4.0 Launcher2源码分析——导入eclipse进行调试
  6. linux android sdk的问题(Unable to get buffer of resource ass
  7. 移植opencv2.4.9到android过程记录
  8. Android(安卓)sd卡使用解说
  9. android adb命令行

随机推荐

  1. Edittext设置输入属性,包括使用代码设置
  2. 】Android横竖屏总结
  3. 7.ProgressBar
  4. Android 禁止Edittext弹出系统软键盘 的
  5. Android中的Button自定义点击效果实例代
  6. 移动开发书籍推荐
  7. android软键盘事件处理
  8. android中BroadCastReceiver使用(广播的
  9. 详解Android中的屏幕方向
  10. Android(安卓)唯一识别码