Android init.rc脚本详解
扫描二维码
随时随地手机看文章
[概述]
用于指导init进程如何启动Android系统,由若干个段(Sections)组成;
[功能]
[1] 控制init进程何时如何执行某个动作
[2] 控制init进程何时如何启动某个服务
[语法]
init rc脚本包含导入(import)、动作(Actions)、命令(Commands)、服务(Service)和选项(Options)五种语句,语法如下:
基本语法
每个语句占一行,由若干个空格分隔的标记组成,标记之间用空格或TAB分割,若标记中存在空格需要用'\'转义(或使用"单词 单词"形式)
例:init.rc文件
export xxy /system/frame\ work
export xxy /system/"frame work"
语句太长,一行写不下,可以用'\'将多行连接成一行, '\'字符后不能有任何字符,包括空格
:
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 \
-c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin
以'#'打头的行为注释行
:
# setup the global environment
一个导入(import)、动作(Actions)或服务(Service)语句是一个段(Sections)
命令(Commands)属于上面离它最近的动作(Actions),单独的命令将被忽略
选项(Options)属于上面离它最近的服务(Service),单独的选项将被忽略
语句
导入(import)
------------
组成:
import <filename>
filename
rc脚本文件
:
import init.sun5i.usb.rc
动作(Actions)
-------------
组成:
on <name or trigger>
<command>
... >
<command>
on
动作的关键字
名字(name)
rc脚本中必须唯一,如果存在相同名字(name)的动作,只有第一个动作有效,
:
early-init
init进程启动后,挂载虚拟文件系统及/dev目录之后促发,通常用于完成冷启动设备文件建立
init
完成默认属性(/default.prop)、logo显示和设置硬件只读属性,冷启动设备文件建立完成之后,文件系统挂载之前,通常用于完成文件系统目录结构的建立
:
early-fs、fs、post-fs和post-fs-data
init动作执行完成之后促发,用于挂载各种类型的文件系统
early-boot和boot
完成post-fs-data动作、系统属性(/system/build.prop和/system/default.prop文件)加载和用户属性(/data/local.prop文件和data/property目录下文件中)加载、信号初始化之后,
用于完成设备使能和shell环境初始化
:
late-init
相当于early-fs、fs、post-fs、post-fs-data、early-boot和boot动作的合并
property:属性名=属性值
属性被设置成"属性值"时促发
init.rc文件的306行 :
on property:prop.test=test_value
mkdir /data/temp 0775 root system
command
命令,属于上面离它最近的动作(Actions),单独的命令将被忽略
执行
当动作被促发时,动作将会被添加到动作执行队列,当动作中的所有命令依次执行完毕时,动作从执行队列中删除;
init程序还添加了一些内部动作,详细见第二天《课堂笔记》
命令(Commands)
-------------
exec <path> [ argument ... ]
fork + exec 执行指定程序,init进程会阻塞等待程序执行完成
path 带路径的程序名
argument 程序参数
export <name> <value>
设置init进程环境变量,完成后会被所有init启动的新进程继承
name 环境变量名
value 环境变量的值
:
export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
ifup <interface>
使能网卡
interface 网卡设备名
:
ifup lo
hostname <name>
设置主机名
name 主机名
:
hostname localhost
chmod <octal-mode> <path>
修改文件或目录的模式(通常指权限)
8进制的数表示的权限
path 带路径的文件或目录
:
chmod 0664 /sys/module/lowmemorykiller/parameters/adj
chown <owner> <group> <path>
修改文件或目录的所有者和组
owner 所有者
group 组
path 带路径的文件或目录
:
chown root system /sys/module/lowmemorykiller/parameters/minfree
class_start <serviceclass>
启动某一类的服务
serviceclass 服务类
:
class_start core
class_stop <serviceclass>
停止某一类的服务
serviceclass 服务类
<name>
设置域名(一组计算机的集合)
<path>
加载内核驱动模块
path 带路径的内核驱动模块
:
insmod /system/vendor/modules/gslX680.ko
<path> [mode owner group]
新建目录
path 带路径的命令名
mode 文件模式(通常指权限)
owner 文件所有者
group 文件组
mode owner group为选择指定,不指定为0755 root root
:
mkdir /mnt 0775 root system
<type> <device> <dir> [ mountoption ... ]
挂载文件系统
type 文件系统类型
device 文件系统所在设备
dir 挂载目录
mountoption 参数和Linux的mount命令类似
:
mount cgroup none /acct cpuacct
<name> <value>
设置属性值
name 属性名
value 属性值
:
setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208
<resource> <cur> <max>
设置系统资源限制
resource 资源编号
cur 资源当前(软件)限制值
max 资源最大(硬件)限制值
:
setrlimit 13 40 40
<service>
启动服务
service 服务名
:
start ueventd
<service>
停止服务
service 服务名
:
stop adbd
<target> <path>
建立软链接文件
target 软链接文件
path 带路径的源文件
:
symlink /system/etc /etc
<mins_west_of_gmt>
设置系统基准时间
mins_west_of_gmt 设置格林尼治时间差几分钟,一般为0
:
sysclktz 0
<event>
促发一个动作
event 动作
:
trigger post-fs-data
<path> <string> [ string ... ]
写字符串到文件中
path 带路径的文件名
string 字符串,可以有多个
:
write /proc/sys/kernel/panic_on_oops 1
<path>
修改init进程的当前目录
<path>
删除文件
path 带路径的文件名
<path>
删除目录
path 带路径的目录名
<path>
等待文件被创建
path 带路径的文件名
<level>
设置内核的log级别
level 内核级别(0-7)
init.rc文件中的7行 :
loglevel 6
:
所有命令的执行函数
所有动作、服务、命令和选项列表
服务(Service)
-------------
:
service <name> <pathname> [argument ...]
<option>
... >
<option>
name
rc脚本中必须唯一
pathname [argument ...]
带路径的服务程序名及参数
option
说明服务的选项
选项(Options)
-------------
:
critical
4分钟之内重启了4次该服务,重启Android系统进入recovery模式
disabled
服务不能使用start_class命令启动,必须通过服务名称启动
setenv <name> <value>
设置环境变量,并且将其做为服务进程的环境变量
name 环境变量名
value 设置的值
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组
user <username>
指定服务进程所属用户,默认root
username 用户名
group <groupname> [groupname] [...]
默认root
groupname 组名
oneshot
服务进程退出时,不重启
class <name>
指定服务所属类,这样可以使用class_start命令启动同一类的多个服务
如果没有指定,服务属于默认(default)类
name 类名
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进程当前的运行状态:
init.action
init进程当前正在执行的动作的名称
init.command
init进程当前正在执行的命令的名称
init.svc.<name>
指定服务的状态(stopped、running和restarting),name为服务名
:
getprop init.svc.zygote
返回running
韦东山嵌入式Android课程推荐
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!