Android初始化脚本解析

Android初始化脚本(init.rc)概述

    Android初始化脚本语言包含了四种类型的声明:Actions(行动)、Commands(命令)、Services(服务)和Options(选项)。
    脚本的内容以行为单位的,各种记号由空格来隔开。C语言风格的反斜杠号可用于在记号间插入空格。双引号也可用于防止
字符串被空格分割成多个记号。行末的反斜杠用于折行。
    注释行以井号(#)开头(允许以空格开头)。
    Actions和Services用来声明一个新的分组。所有的命令或选项都属于最近申明的分组。位于第一个分组之前的命令或选项将会被忽略。
    Actions和Services有唯一的名字。如果有重名的情况,第二个申明的将会被作为错误忽略。

init.rc包含四种类型的声明

Actions语法

on <trigger>
    <command>
    <command>
    <command>

Triggers描述

关键字 描述
early-init init之前触发的时机,通常用来初始化设备节点
init 初始化时机,在boot之前触发
early-boot boot之前触发的时机
boot 启动的时机
<name>=<value> 属性<name>设置为指定的<value>时触发
device-added-<path>、device-removed-<path> 添加或移除设备节点时触发
service-exited-<name> 当特定的设备退出时触发

Commands描述

关键字 描述
exec <path> [ <argument> ]* 执行一个程序,并阻塞直到程序退出
export <name> <value> 设置环境变量
ifup <interface> 开启网络接口
import <filename> 加载初始化配置文件,对当前的配置做扩展
hostname <name> 设置主机名
chmod <octal-mode> <path> 更改文件访问权限
chown <owner> <group> <path> 更改文件的所有者和组
class_start <serviceclass> 开启指定的service,如果他们没有在运行
class_stop <serviceclass> 停止已经运行的指定的service
domainname <name> 设置域名
insmod <path> 安装系统模块
mkdir <path> [mode] [owner] [group] 创建文件夹
mount <type> <device> <dir> [ <mountpoint> ]* 挂载设备,<mountoption>包括 "ro"、"rw"、"remount"、"noatime"
setkey 未使用
setprop <name> <value> 设置系统属性值
setrlimit <resource> <cur> <max> 设置资源限制
start <service> 开启service,如果他们没有在运行
restart <service> 重启service,停止之前运行的服务,重新启动
stop <service> 停止已经运行的service
symlink <target> <path> 创建软链接
sysclktz <mins_west_of_gmt> 设置系统时钟基准(0代表时钟滴答以格林威治平均时(GMT)为准)
trigger <event> 触发一个事件。用于将一个action与另一个action排列
write <path> <string> [ <string> ]* 打开文件,并写入内容

Services语法

service <name> <pathname> [<argument>] *
    <option>
    <option>
    <option>

Options描述

关键字 描述
critical 说明这是一个对于设备关键的服务。如果他四分钟内退出大于四次,系统将会重启并进入recovery(恢复)模式
disabled 不允许自动运行
setenv <name> <value> 在进程启动时将环境变量<name>设置为<value>
socket <type> <name> <perm> [ <user> [ <group> ] ] 创建一个unix域的socket,名为/dev/socket/<name>,并将它的描述符传递给启动进程。<type> 必须是 "dgram"或"stream"。user和group默认为0
user <username> 执行service前改变username,默认是root
group <groupname> [ <groupname> ]* 执行service前改变groupname,默认是root
capability [ <capability> ]+ 执行service前设置linux capability
oneshot 只执行一次,服务退出时不重启
class <name> 为service指定类名,所有同一类的服务可以同时启动和停止。如果不通过class选项指定一个类,则默认为"default"类服务
onrestart 当服务重启,执行一个命令

Property描述

关键字 描述
init.action action被执行
init.command command被执行
init.svc.<name> service状态,如"stopped","running","restarting"

init.rc示例

on early-init
    start ueventd

on boot
    export PATH /sbin:/system/sbin:/system/bin
    export LD_LIBRARY_PATH /system/lib

    mkdir /dev
    mkdir /proc
    mkdir /sys

    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

    hostname localhost
    domainname localhost

    mount yaffs2 mtd@system /system
    mount yaffs2 mtd@userdata /data

    import /system/etc/init.conf

    class_start default

service adbd /sbin/adbd
    user adb
    group adb

service usbd /system/bin/usbd -r
    user usbd
    group usbd
    socket usbd 666

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media

on device-added-/dev/compass
    start akmd

# 将akmd的输出重定向到Android的log
service /system/bin/logwrapper /sbin/akmd
    disabled
    user akmd
    group akmd