1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Android init.rc脚本详解

Android init.rc脚本详解

时间:2023-07-29 21:12:53

相关推荐

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\ workexport 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.bin3. 以"#"打头的行为注释行例:# setup the global environment4. 一个导入(import)、动作(Actions)或服务(Service)语句是一个段(Sections)命令(Commands)属于上面离它最近的动作(Actions),单独的命令将被忽略选项(Options)属于上面离它最近的服务(Service),单独的选项将被忽略[2] 语句导入(import)------------包含其他init.rc脚本文件, 组成:import <filename>1. filenamerc脚本文件例: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-initinit进程启动后,挂载虚拟文件系统及/dev目录之后促发,通常用于完成冷启动设备文件建立(2) init完成默认属性(/default.prop)、logo显示和设置硬件只读属性,冷启动设备文件建立完成之后,文件系统挂载之前,通常用于完成文件系统目录结构的建立4.4版本以下支持:(3) early-fs、fs、post-fs和post-fs-datainit动作执行完成之后促发,用于挂载各种类型的文件系统(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_valuemkdir /data/temp 0775 root system3. 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/xbin3. ifup <interface>使能网卡interface 网卡设备名例:ifup lo4. hostname <name>设置主机名name 主机名例:hostname localhost5. chmod <octal-mode> <path>修改文件或目录的模式(通常指权限)octal-mode 8进制的数表示的权限path带路径的文件或目录例:chmod 0664 /sys/module/lowmemorykiller/parameters/adj6. chown <owner> <group> <path>修改文件或目录的所有者和组owner 所有者group 组path带路径的文件或目录例:chown root system /sys/module/lowmemorykiller/parameters/minfree7. class_start <serviceclass>启动某一类的服务serviceclass 服务类例:class_start core8. class_stop <serviceclass>停止某一类的服务serviceclass 服务类9.domainname <name>设置域名(一组计算机的集合)10.insmod <path>加载内核驱动模块path带路径的内核驱动模块例:insmod /system/vendor/modules/gslX680.ko11.mkdir <path> [mode owner group]新建目录path带路径的命令名mode文件模式(通常指权限)owner 文件所有者group 文件组mode owner group为选择指定,不指定为0755 root root例:mkdir /mnt 0775 root system12.mount <type> <device> <dir> [ mountoption ... ]挂载文件系统type 文件系统类型device 文件系统所在设备dir 挂载目录mountoption 参数和Linux的mount命令类似例:mount cgroup none /acct cpuacct13.setprop <name> <value>设置属性值name 属性名value属性值例:setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,11020814.setrlimit <resource> <cur> <max>设置系统资源限制resource 资源编号cur 资源当前(软件)限制值max 资源最大(硬件)限制值例:setrlimit 13 40 4015.start <service>启动服务service 服务名例:start ueventd16.stop <service>停止服务service 服务名例:stop adbd17.symlink <target> <path>建立软链接文件target 软链接文件path带路径的源文件例:symlink /system/etc /etc18.sysclktz <mins_west_of_gmt>设置系统基准时间mins_west_of_gmt 设置格林尼治时间差几分钟,一般为0例:sysclktz 019.trigger <event>促发一个动作event 动作例:trigger post-fs-data20.write <path> <string> [ string ... ]写字符串到文件中path带路径的文件名string 字符串,可以有多个例:write /proc/sys/kernel/panic_on_oops 121.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. critical4分钟之内重启了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和seqpacketdgram 无序报文传送,不保证可靠seqpacket 顺序报文传送,不保证可靠stream流传送,保证可靠perm 指定权限(八进制的数表示)user 指定所属用户, 默认root用户group 指定所属主,默认root组5. user <username>指定服务进程所属用户,默认rootusername 用户名6. group <groupname> [groupname] [...]指定服务进程组, 默认rootgroupname 组名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/akmdProperties----------init进程的属性值,使别的进程可以看到init进程当前的运行状态:1. init.actioninit进程当前正在执行的动作的名称2. mandinit进程当前正在执行的命令的名称3. init.svc.<name>指定服务的状态(stopped、running和restarting),name为服务名例:getprop init.svc.zygote返回running

韦东山嵌入式Android课程推荐

01

支持我请给我在看!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。