Android init.rc脚本详解
扫描二维码
随时随地手机看文章
[概述]
用于指导init进程如何启动Android系统,由若干个段(Sections)组成;
[功能]
[1] 控制init进程何时如何执行某个动作
[2] 控制init进程何时如何启动某个服务
[语法]
init rc脚本包含导入(import)、动作(Actions)、命令(Commands)、服务(Service)和选项(Options)五种语句,语法如下:基本语法每个语句占一行,由若干个空格分隔的标记组成,标记之间用空格或TAB分割,若标记中存在空格需要用'\'转义(或使用"单词 单词"形式)例:init.rc文件export xxy /system/frame\ workexport xxy /system/"frame work"语句太长,一行写不下,可以用'\'将多行连接成一行, '\'字符后不能有任何字符,包括空格:service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 \-c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin以'#'打头的行为注释行:# setup the global environment一个导入(import)、动作(Actions)或服务(Service)语句是一个段(Sections)命令(Commands)属于上面离它最近的动作(Actions),单独的命令将被忽略选项(Options)属于上面离它最近的服务(Service),单独的选项将被忽略语句导入(import)------------组成:import <filename>filenamerc脚本文件:import init.sun5i.usb.rc动作(Actions)-------------组成:on <name or trigger><command>... ><command>on动作的关键字名字(name)rc脚本中必须唯一,如果存在相同名字(name)的动作,只有第一个动作有效,:early-initinit进程启动后,挂载虚拟文件系统及/dev目录之后促发,通常用于完成冷启动设备文件建立init完成默认属性(/default.prop)、logo显示和设置硬件只读属性,冷启动设备文件建立完成之后,文件系统挂载之前,通常用于完成文件系统目录结构的建立:early-fs、fs、post-fs和post-fs-datainit动作执行完成之后促发,用于挂载各种类型的文件系统early-boot和boot完成post-fs-data动作、系统属性(/system/build.prop和/system/default.prop文件)加载和用户属性(/data/local.prop文件和data/property目录下文件中)加载、信号初始化之后,用于完成设备使能和shell环境初始化:late-init相当于early-fs、fs、post-fs、post-fs-data、early-boot和boot动作的合并property:属性名=属性值属性被设置成"属性值"时促发: init.rc文件的306行on property:prop.test=test_valuemkdir /data/temp 0775 root systemcommand命令,属于上面离它最近的动作(Actions),单独的命令将被忽略执行当动作被促发时,动作将会被添加到动作执行队列,当动作中的所有命令依次执行完毕时,动作从执行队列中删除;init程序还添加了一些内部动作,详细见第二天《课堂笔记》命令(Commands)-------------exec <path> [ argument ... ]fork + exec 执行指定程序,init进程会阻塞等待程序执行完成path 带路径的程序名argument 程序参数export <name> <value>设置init进程环境变量,完成后会被所有init启动的新进程继承name 环境变量名value 环境变量的值:export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbinifup <interface>使能网卡interface 网卡设备名:ifup lohostname <name>设置主机名name 主机名:hostname localhostchmod <octal-mode> <path>修改文件或目录的模式(通常指权限)8进制的数表示的权限path 带路径的文件或目录:chmod 0664 /sys/module/lowmemorykiller/parameters/adjchown <owner> <group> <path>修改文件或目录的所有者和组owner 所有者group 组path 带路径的文件或目录:chown root system /sys/module/lowmemorykiller/parameters/minfreeclass_start <serviceclass>启动某一类的服务serviceclass 服务类:class_start coreclass_stop <serviceclass>停止某一类的服务serviceclass 服务类<name>设置域名(一组计算机的集合)<path>加载内核驱动模块path 带路径的内核驱动模块:insmod /system/vendor/modules/gslX680.ko<path> [mode owner group]新建目录path 带路径的命令名mode 文件模式(通常指权限)owner 文件所有者group 文件组mode owner group为选择指定,不指定为0755 root root:mkdir /mnt 0775 root system<type> <device> <dir> [ mountoption ... ]挂载文件系统type 文件系统类型device 文件系统所在设备dir 挂载目录mountoption 参数和Linux的mount命令类似:mount cgroup none /acct cpuacct<name> <value>设置属性值name 属性名value 属性值:setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208<resource> <cur> <max>设置系统资源限制resource 资源编号cur 资源当前(软件)限制值max 资源最大(硬件)限制值:setrlimit 13 40 40<service>启动服务service 服务名:start ueventd<service>停止服务service 服务名:stop adbd<target> <path>建立软链接文件target 软链接文件path 带路径的源文件:symlink /system/etc /etc<mins_west_of_gmt>设置系统基准时间mins_west_of_gmt 设置格林尼治时间差几分钟,一般为0:sysclktz 0<event>促发一个动作event 动作:trigger post-fs-data<path> <string> [ string ... ]写字符串到文件中path 带路径的文件名string 字符串,可以有多个:write /proc/sys/kernel/panic_on_oops 1<path>修改init进程的当前目录<path>删除文件path 带路径的文件名<path>删除目录path 带路径的目录名<path>等待文件被创建path 带路径的文件名<level>设置内核的log级别level 内核级别(0-7): init.rc文件中的7行loglevel 6:所有命令的执行函数所有动作、服务、命令和选项列表服务(Service)-------------:service <name> <pathname> [argument ...]<option>... ><option>namerc脚本中必须唯一pathname [argument ...]带路径的服务程序名及参数option说明服务的选项选项(Options)-------------:critical4分钟之内重启了4次该服务,重启Android系统进入recovery模式disabled服务不能使用start_class命令启动,必须通过服务名称启动setenv <name> <value>设置环境变量,并且将其做为服务进程的环境变量name 环境变量名value 设置的值socket <name> <type> <perm> [user [group]]创建unix域socket(即创建文件/dev/socket/<name>),并且打开,将文件描述符传给服务文件描述符存在ANDROID_SOCKET_<name>的环境变量中name socket名type socket类型,只能dgram、stream和seqpacketdgram 无序报文传送,不保证可靠seqpacket 顺序报文传送,不保证可靠stream 流传送,保证可靠perm 指定权限(八进制的数表示)user 指定所属用户, 默认root用户group 指定所属主,默认root组user <username>指定服务进程所属用户,默认rootusername 用户名group <groupname> [groupname] [...]默认rootgroupname 组名oneshot服务进程退出时,不重启class <name>指定服务所属类,这样可以使用class_start命令启动同一类的多个服务如果没有指定,服务属于默认(default)类name 类名onrestart <command>服务重启时,运行指定程序command 命令及其参数例:在init.rc和init.sun5i.rc中寻找调试注意:默认Android系统会将进程的标准输出和标准错误重定位到/dev/null(没有设置console)或/dev/console(有设置console)如果想看到进程输出,请使用logwrapper程序启动进程,如:service akmd /system/bin/logwrapper /sbin/akmdProperties----------init进程的属性值,使别的进程可以看到init进程当前的运行状态:init.actioninit进程当前正在执行的动作的名称init.commandinit进程当前正在执行的命令的名称init.svc.<name>指定服务的状态(stopped、running和restarting),name为服务名:getprop init.svc.zygote返回running
韦东山嵌入式Android课程推荐
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!





