查看原文
其他

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


韦东山嵌入式Android课程推荐

01









支持我请给我在看!









    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存