其他
Android init.rc脚本详解
[概述]
用于指导init进程如何启动Android系统,由若干个段(Sections)组成;
init进程解析/init.rc脚本
[功能]
[1] 控制init进程何时如何执行某个动作
[2] 控制init进程何时如何启动某个服务
[语法]
init rc脚本包含导入(import)、动作(Actions)、命令(Commands)、服务(Service)和选项(Options)五种语句,语法如下:
[1] 基本语法
1. 每个语句占一行,由若干个空格分隔的标记组成,标记之间用空格或TAB分割,若标记中存在空格需要用'\'转义(或使用"单词 单词"形式)
例:init.rc文件
export xxy /system/frame\ work
export xxy /system/"frame work"
2. 语句太长,一行写不下,可以用'\'将多行连接成一行, '\'字符后不能有任何字符,包括空格
例:
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 \
-c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin
3. 以'#'打头的行为注释行
例:
# setup the global environment
4. 一个导入(import)、动作(Actions)或服务(Service)语句是一个段(Sections)
命令(Commands)属于上面离它最近的动作(Actions),单独的命令将被忽略
选项(Options)属于上面离它最近的服务(Service),单独的选项将被忽略
[2] 语句
导入(import)
------------
包含其他init.rc脚本文件, 组成:
import <filename>
1. filename
rc脚本文件
例:
import init.sun5i.usb.rc
动作(Actions)
-------------
动作是给一个命令序列取一个名字(name)或提供一个促发表达式(trigger), 组成:
on <name or trigger>
<command>
< ... >
<command>
1. on
动作的关键字
2. 名字(name)
也称事件(event),在init rc脚本中必须唯一,如果存在相同名字(name)的动作,只有第一个动作有效,
init进程或其他动作(Actions)的trigger命令可以通过名字促发动作(Actions),init进程可以促发如下动作:
(1) early-init
init进程启动后,挂载虚拟文件系统及/dev目录之后促发,通常用于完成冷启动设备文件建立
(2) init
完成默认属性(/default.prop)、logo显示和设置硬件只读属性,冷启动设备文件建立完成之后,文件系统挂载之前,通常用于完成文件系统目录结构的建立
4.4版本以下支持:
(3) early-fs、fs、post-fs和post-fs-data
init动作执行完成之后促发,用于挂载各种类型的文件系统
(4) early-boot和boot
完成post-fs-data动作、系统属性(/system/build.prop和/system/default.prop文件)加载和用户属性(/data/local.prop文件和data/property目录下文件中)加载、信号初始化之后,
用于完成设备使能和shell环境初始化
5.0版本支持:
(3) late-init
相当于early-fs、fs、post-fs、post-fs-data、early-boot和boot动作的合并
促发表达式(trigger)
(5) property:属性名=属性值
属性被设置成"属性值"时促发
例: init.rc文件的306行
on property:prop.test=test_value
mkdir /data/temp 0775 root system
3. command
命令,属于上面离它最近的动作(Actions),单独的命令将被忽略
4. 执行
当动作被促发时,动作将会被添加到动作执行队列,当动作中的所有命令依次执行完毕时,动作从执行队列中删除;
init程序还添加了一些内部动作,详细见第二天《课堂笔记》
命令(Commands)
-------------
1. exec <path> [ argument ... ]
fork + exec 执行指定程序,init进程会阻塞等待程序执行完成
path 带路径的程序名
argument 程序参数
2. export <name> <value>
设置init进程环境变量,完成后会被所有init启动的新进程继承
name 环境变量名
value 环境变量的值
例:
export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
3. ifup <interface>
使能网卡
interface 网卡设备名
例:
ifup lo
4. hostname <name>
设置主机名
name 主机名
例:
hostname localhost
5. chmod <octal-mode> <path>
修改文件或目录的模式(通常指权限)
octal-mode 8进制的数表示的权限
path 带路径的文件或目录
例:
chmod 0664 /sys/module/lowmemorykiller/parameters/adj
6. chown <owner> <group> <path>
修改文件或目录的所有者和组
owner 所有者
group 组
path 带路径的文件或目录
例:
chown root system /sys/module/lowmemorykiller/parameters/minfree
7. class_start <serviceclass>
启动某一类的服务
serviceclass 服务类
例:
class_start core
8. class_stop <serviceclass>
停止某一类的服务
serviceclass 服务类
9.domainname <name>
设置域名(一组计算机的集合)
10.insmod <path>
加载内核驱动模块
path 带路径的内核驱动模块
例:
insmod /system/vendor/modules/gslX680.ko
11.mkdir <path> [mode owner group]
新建目录
path 带路径的命令名
mode 文件模式(通常指权限)
owner 文件所有者
group 文件组
mode owner group为选择指定,不指定为0755 root root
例:
mkdir /mnt 0775 root system
12.mount <type> <device> <dir> [ mountoption ... ]
挂载文件系统
type 文件系统类型
device 文件系统所在设备
dir 挂载目录
mountoption 参数和Linux的mount命令类似
例:
mount cgroup none /acct cpuacct
13.setprop <name> <value>
设置属性值
name 属性名
value 属性值
例:
setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208
14.setrlimit <resource> <cur> <max>
设置系统资源限制
resource 资源编号
cur 资源当前(软件)限制值
max 资源最大(硬件)限制值
例:
setrlimit 13 40 40
15.start <service>
启动服务
service 服务名
例:
start ueventd
16.stop <service>
停止服务
service 服务名
例:
stop adbd
17.symlink <target> <path>
建立软链接文件
target 软链接文件
path 带路径的源文件
例:
symlink /system/etc /etc
18.sysclktz <mins_west_of_gmt>
设置系统基准时间
mins_west_of_gmt 设置格林尼治时间差几分钟,一般为0
例:
sysclktz 0
19.trigger <event>
促发一个动作
event 动作
例:
trigger post-fs-data
20.write <path> <string> [ string ... ]
写字符串到文件中
path 带路径的文件名
string 字符串,可以有多个
例:
write /proc/sys/kernel/panic_on_oops 1
21.chdir <path>
修改init进程的当前目录
22.rm <path>
删除文件
path 带路径的文件名
23.rmdir <path>
删除目录
path 带路径的目录名
24.wait <path>
等待文件被创建
path 带路径的文件名
25.loglevel <level>
设置内核的log级别
level 内核级别(0-7)
例: init.rc文件中的7行
loglevel 6
以上是常用的命令,不同版本可能命令有区别,具体可以查看Android源代码的以下文件确定:
system/core/init/builtins.c 所有命令的执行函数
system/core/init/keywords.h 所有动作、服务、命令和选项列表
服务(Service)
-------------
服务(Service)是由init进程启动并且保证其一直运行的程序,组成如下:
service <name> <pathname> [argument ...]
<option>
< ... >
<option>
1. name
服务的名字,在init rc脚本中必须唯一
2. pathname [argument ...]
带路径的服务程序名及参数
3. option
说明服务的选项
选项(Options)
-------------
用于告诉init进程什么时候如何启动服务,存在如下选项:
1. critical
4分钟之内重启了4次该服务,重启Android系统进入recovery模式
2. disabled
服务不能使用start_class命令启动,必须通过服务名称启动
3. setenv <name> <value>
设置环境变量,并且将其做为服务进程的环境变量
name 环境变量名
value 设置的值
4. socket <name> <type> <perm> [user [group]]
创建unix域socket(即创建文件/dev/socket/<name>),并且打开,将文件描述符传给服务
文件描述符存在ANDROID_SOCKET_<name>的环境变量中
name socket名
type socket类型,只能dgram、stream和seqpacket
dgram 无序报文传送,不保证可靠
seqpacket 顺序报文传送,不保证可靠
stream 流传送,保证可靠
perm 指定权限(八进制的数表示)
user 指定所属用户, 默认root用户
group 指定所属主,默认root组
5. user <username>
指定服务进程所属用户,默认root
username 用户名
6. group <groupname> [groupname] [...]
指定服务进程组, 默认root
groupname 组名
7. oneshot
服务进程退出时,不重启
8. class <name>
指定服务所属类,这样可以使用class_start命令启动同一类的多个服务
如果没有指定,服务属于默认(default)类
name 类名
9. onrestart <command>
服务重启时,运行指定程序
command 命令及其参数
例:在init.rc和init.sun5i.rc中寻找
调试注意:默认Android系统会将进程的标准输出和标准错误重定位到/dev/null(没有设置console)或/dev/console(有设置console)
如果想看到进程输出,请使用logwrapper程序启动进程,如:
service akmd /system/bin/logwrapper /sbin/akmd
Properties
----------
init进程的属性值,使别的进程可以看到init进程当前的运行状态:
1. init.action
init进程当前正在执行的动作的名称
2. init.command
init进程当前正在执行的命令的名称
3. init.svc.<name>
指定服务的状态(stopped、running和restarting),name为服务名
例:
getprop init.svc.zygote
返回running
韦东山嵌入式Android课程推荐
01