Android init 脚本语言说明

android 官方说明

概述

Android Init 语言由四大类语句组成,它们是 Actions、Commands、Services 和 Options。

所有这些都是面向行的,由空格分隔的标记组成。 c 样式的反斜杠转义可用于将空格插入到标记中。 双引号也可用于防止空格将文本分成多个标记。 反斜杠,当它是一行的最后一个字符时,可以用于换行。

以 # 开头的行(允许前导空格)是注释。

Actions 和 Services 隐式声明了一个新部分。 所有Commands或Options都属于最近声明的部分。 第一部分之前的Commands或Options将被忽略。

Actions 和Services 具有唯一的名称。 如果第二个 Action 或 Service 被声明为与现有的同名,则将其作为错误忽略。 (???我们应该覆盖而不是)

Actions

Actions 是命名的命令序列。 Actions 有一个触发器,用于确定动作何时发生。 当发生与Actions 的触发器匹配的事件时,该Actions 将添加到待执行队列的尾部(除非它已经在队列中)。

队列中的每个 action 都按顺序出队,并且该动作中的每个命令都按顺序执行。 Init 在活动中的命令执行“之间”处理其他活动(设备创建/销毁、属性设置、进程重 启)。

命令采取以下形式:

on 
   
   
   

Services

服务是在它们退出时启动并(可选)重新启动的程序。
服务采取以下形式:

service   [  ]*
   

Options

选项是服务的调节器。他们影响init进程如何并且何时运行这个服务。

 critical
    这是一个设备关键服务。如果他在四分钟内存在超过四次,设备将会重启进入恢复模式。
  
  disabled
    这个服务将不能与他的类自动启动。他必须通过名称被显示启动。
  
  setenv <名称> <值>
    在启动进程中设置环境变量<名称>到<数值>
  
 socket    [  [  [  ] ] ]
   创建一个unix域套接字,命名为 /dev/socket/,并且传递他的文件描述符fd到启动进程中。
   必须是"dgram","stream"或者是"seqpacket"。
   User和group默认为0。
   'seclabel'是这个套接字的SELinux安全上下文。
   他默认为服务安全上下文,由seclabel指定或者是基于服务可执行文件安全上下文计算得来。
 
 user 
   在运行这个服务之前改为username(用户名称)。
   当前默认为root.目前,如果你的进程需要linux功能,那么你不能使用这个命令。你必须在进程中
   请求功能但依然root,然后降级到你期望的uid。
 
 group  [  ]*
   在运行这个服务之前修改为groupname。在第一个之前的组名称被用来设置进程的追加的组(通过setgrooups())
   。目前默认为root。
 
 seclabel 
   在执行这个服务之前改为seclabel。主要是从rootfs等中被services使用。
   位于系统分区的services可以基于他们的文件安全上下文使用策略定义的转换。
   如果未被指定或者是在策略中没有转换被定义,默认为初始化上下文。
 
 oneshot
   当他退出的时候不要重启服务。
 
 class 
   为服务指定一个类名称。位于一个命名的类中的所有服务一起被启动或停止。
   如果服务未被class选项指定,则该服务位于类'default'中。
 
 onrestart
   当services重启的时候运行一个命令。
 
 writepid 
   当子进程被创建的时候,将子进程的pid写入到给定的文件中。意味着cgroup/cpuset
   用法。

触发器

触发器是可用于匹配某些类型的字符串
事件并用于导致动作发生。

boot
这是 init 启动时将发生的第一个触发器
(在 /init.conf 加载后)

=
设置属性 时会发生这种形式的触发器
到特定值

device-added-
device-removed-
添加设备节点时会发生这些形式的触发器
或删除。

service-exited-
这种形式的触发器在指定的服务退出时发生。

示例:

on boot
# basic network init
    ifup lo
    hostname localhost
    domainname localdomain

# set RLIMIT_NICE to allow priorities from 19 to -20
    setrlimit 13 40 40

# Define the oom_adj values for the classes of processes that can be
# killed by the kernel.  These are used in ActivityManagerService.
    setprop ro.FOREGROUND_APP_ADJ 0
    setprop ro.VISIBLE_APP_ADJ 1
...

命令

exec  [  ]*
   fork 并执行一个程序 ()。这将阻塞直到
   程序完成执行。最好避免执行
   与内置命令不同,它冒着获取的风险
   初始化“卡住”。 (???也许应该有一个超时?)

export  
   将环境变量  设置为等于  在
   全局环境(将被所有进程继承
   此命令执行后启动)

ifup 
   使网络接口  联机。

import 
   解析一个初始化配置文件,扩展当前配置。

hostname 
   设置主机名。

chdir 
   更改工作目录。

chmod  
   更改文件访问权限。

chown   
   更改文件所有者和组。

chroot 
  更改进程根目录。

class_start 
   启动指定类的所有服务,如果它们是
   尚未运行。

class_stop 
   停止指定类的所有服务,如果它们是
   目前正在运行。

domainname 
   设置域名。

insmod 
   将模块安装在 

mkdir  [mode] [owner] [group]
   在  处创建一个目录,可选择使用给定的模式、所有者和
   团体。如果未提供,则使用权限 755 和
   由 root 用户和 root 组拥有。

mount    [  ]*
   尝试将命名设备挂载到目录 
    可以是 mtd@name 的形式来指定一个 mtd 块
   设备名称。
   s 包括 "ro", "rw", "remount", "noatime", ...

restorecon  命名的文件恢复到指定的安全上下文
   在 file_contexts 配置中。
   init.rc 创建的目录不需要,因为这些是
   由 init 自动正确标记。

setcon 
   将当前进程安全上下文设置为指定的字符串。
   这通常仅在 early-init 中用于设置初始化上下文
   在任何其他进程开始之前。

setenforce 0|1
   设置 SELinux 系统范围的强制执行状态。
   0 是允许的(即记录但不拒绝),1 是强制的。

setkey
   待定

setprop  
   将系统属性  设置为 。

setrlimit   
   设置资源的 rlimit。

setsebool  
   将 SELinux 布尔  设置为  可以是 1|true|on 或 0|false|off

start 
   如果服务尚未运行,则启动该服务。

stop 
   如果服务当前正在运行,则停止它的运行。

symlink   处创建一个符号链接,其值为 

sysclktz 
   设置系统时钟基准(如果系统时钟在 GMT 计时,则为 0)

trigger 
   触发事件。用于将另一个动作排队
   行动。

wait  [  ]
  轮询给定文件的存在并在找到时返回,
  或已达到超时。如果未指定超时,则
  当前默认为五秒。

write   [  ]*
   在  打开文件并写入一个或多个字符串
   用 write(2)

你可能感兴趣的:(Android init 脚本语言说明)