init.rc语法

概述

一个完整的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 #    

你可能感兴趣的:(Android,原理)