概述
一个完整的init.rc脚本是由四种类型组成的。即:
- Action
- Commands
- Services
- Options
Action
格式
格式如下:
on < Trigger > ## 触发条件
< Command1>
< Command2>
一旦 Trigger被触发,就会执行Command1,Command2.(且Trigger的名字是唯一的,重复则会报错)
init.rc常见的触发器(Trigger)
- boot #这是init程序启动后触发的第一个条件
- < Name> = < Value> # 当某个属性的值为Value时
- device -added < path> # 当某个设备节点被添加
- device -removed < path> # 当某个设备节点被移除
- service -exited < name> # 当名字为name的服务存在时,触发
init.rc常见的命令
- export < name> < value> # 设置环境变量,作用于全局
- mkdir < path> [mode] [ owner] [group]
- mount < type> < device> < dir> [< mountOption>] 尝试在制定路径下挂载一个设备
- write < path> < value> 打开文件,并写入值
Services (服务)
Services 其实是可执行程序,它们在特定选项约束下会被init程序运行或者重启。
格式一般如下:
service < name> < pathName> [< arguments>]
< options>
name: service 的名称
pathName:service所在路径
argument:启动service
option:对service的约束条件。
常见的option
* critical 至关重要的服务
* disabled,此服务不会自动启动,需要显式调用
* setenv< name> < value> 设置环境变量name为value值
* socket < name> < type> < perm> [< user> < group>] 创建一个名为name的unix domain socket, type表示类型:dgram,stream 或者 seqpacket
* user< username>
* group< groupname>
* oneshot 当服务退出后,不要去重启它
* class < name> 为服务指定class名,同一个class的服务需要同时启动或停止
* onrestart 当服务重启时,执行某些命令
总结
对于action来说,它是当trigger发生时执行某些命令;而对于service来说,它是总是发生的,然后去执行pathName下的可执行文件
分析init.rc 文件
on boot ## boot事件
export PATH /sbin:/system/sbin:/system/bin ##设置系统的全局环境变量
export LD_LIBRARY_PATH /system/lib # 相应boot事件,设置库的路径
mkdir /dev
mkdir /proc # 分别创建dev目录、proc目录
mkdir /system
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/cpu/alignment 4 #打开文件并写入值
ifup lo #建立lo网络连接
......
service adbd /sbin/adbd # 启动adbd进程
user adbd
group adbd
Service .....
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666 # 启动zygote服务。
on device-added- /dev/compass
start akmd
on device-removed-/dev/compass
stop akmd # 当移除dev/compass节点后,停止akmd
service akmd /sbin/akmd
disabled #只能显示调用起来
user akmd
group akmd #