Android init.rc脚本详解

简介: Android init.rc脚本详解

[概述]

用于指导init进程如何启动Android系统,由若干个段(Sections)组成;

init进程解析/init.rc脚本


[功能]

[1] 控制init进程何时如何执行某个动作

[2] 控制init进程何时如何启动某个服务


[语法]

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


目录
相关文章
|
7天前
|
Shell Android开发
Android系统 init.rc文件详解
Android系统 init.rc文件详解
26 0
|
7天前
|
安全 Shell Android开发
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
23 0
|
7天前
|
安全 Shell Android开发
Android系统 init.rc开机执行shell脚本
Android系统 init.rc开机执行shell脚本
23 0
|
3月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
|
8天前
|
Android开发
自动化脚本之Android系统修改推送
自动化脚本之Android系统修改推送
11 0
|
8天前
|
Linux Shell Android开发
自动化脚本之GPIO/LED相关适用于Android/Linux
自动化脚本之GPIO/LED相关适用于Android/Linux
14 0
|
8月前
|
Shell Android开发
Android init language与init.rc初始化脚本
Android init language与init.rc初始化脚本
55 0
|
Java 程序员 Android开发
关于安卓脚本打包apk
Android开发过程中,一般习惯依赖于用Android studio来打包apk,通过图形化界面来打包,操作也简单。这种情况一般适用于程序员,有一种情况是,客户需要自己打包,然而客户不是开发者,不懂用Android studio,这个时候要不给他们提供一个打包文档,要不手把手教,但还是有可能存在失误。
443 1
|
XML Android开发 数据格式
Ant打包安卓apk(5)-多渠道(配置)打包方案 ant脚本
不废话, 直接上货 <?xml version="1.0" encoding="UTF-8"?> <project name="MyProject" default="init" basedir="."> <description> simple example build file </description> <!-- 使用第三方的ant包,使ant支持for循环--> <taskdef resource="net/sf/antcontrib/antcontrib.properties"> <classpath> <pathelement l
220 0