在 Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。 init.rc是在init启动后被执行的启动脚本,其语法主要包含了以下内容:
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>
...
如果该服务选项中没有disabled定义,则在init.rc中解析到这个服务的时候,会马上执行这个服务。而如果在服务的选项中增加了disabled定义,则该服务不会在init.rc中启动,需要我们在代码中使用以下方法来启动:property_set("ctl.start", "wifi_dhcpcd");上句话的意思是,我要启动wifi_dhcpd这个服务了。
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特有的共享方式:ashmen
Ashmem是一个匿名共享内存(Anonymous SHaredMEMory)系统,该系统增加了接口因此进程间可以共享具名内存块。举一个例子,系统可以利用Ashmem存储图标,当绘制用户界面的时候多个进程也可以访问。Ashmem优于传统Linux共享内存表现在当共享内存块不再被用的时候,它为Kernel提供一种回收这些共享内存块的手段。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会收到一个错误提示,然后重新分配内存并重载数据。
on init
//在init.c下
//action_for_each_trigger("init",action_add_queue_tail);
//drain_action_queue();
//执行on init下的action;
sysclktz 0
//设置系统时钟基准(0代表时钟滴答以格林威治平均时(GMT)为准)
loglevel 3
//设置loglevel中打印级别。
//依次执行do_loglevel()@builtins.c, log_set_level()@util.c
//只有小于等于 loglevel才输出,参见[email protected]
//如果设置为3,也就是ERROR可以输出而INFO没有输出。
//#define ERROR(x...) log_write(3, "<3>init: " x)
//#define INFO(x...) log_write(6, "<6>init: " x)
export PATH ......
//设置全局变量
symlink /system/etc /etc
//symlink <target> <path> :创建一个指向<path>的软连接<target>
mkdir ...
// mkdir <path> [mode] [owner] [group]
//创建一个目录<path>,可以选择性地指定mode、owner以及group。如果没有指定,默认的权限为755,并属于root用户和root组。
mount ...
//mount <type> <device> <dir> [ <mountoption> ]*
//试图在目录<dir>挂载指定的设备。<device> 可以是以 mtd@name的形式指定一个mtd块设备。<mountoption>包括 //"ro"、"rw"、"remount"、"noatime"、 ...
write /proc/sys/kenel/panic_on_oops 1
//This file (new in Linux 2.5) controls the kernel's behaviour when anoops or BUG is encountered. If this file contains 0, then the systemtries to continueoperation. If it contains 1, then the system delays a few seconds (togive klogd time to record the oops output) and then panics. If the/proc/sys/kernel/panic file is also non-zero then the machine will be rebooted.
write /proc/sys/kernel/sched_latency_ns 600000
write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000
write /proc/sys/kernel/sched_compat_yield 1
write /proc/sys/kernel/sched_child_runs_first 0
write /proc/sys/kernel/sched_min_granularity_ns 400000
write /proc/sys/kernel/sched_features 24188