分类: 嵌入式
2012-05-31 15:06:41
init.rc的语法分为行为(Actions),、命令(Commands) 、服务(Services)、选项(Options)。
类别 |
名称 |
描述 |
SECTION | on | 触发条件 |
同上.. | service | 解析service |
COMMAND | chdir | 更改当前工作目录 |
同上.. | chroot | 更改参考的根目录位置 |
.. | class_start | 启动某个设置了class名称的服务 |
.. | class_stop | 停止某个设置了class名称的服务 |
.. | domainname | 域名 |
.. | exec | 调用程序并转移进程 |
.. | export | 提交变量 |
.. | hostname | 主机名 |
.. | ifup | 激活网卡 |
.. | insmod | 挂载模块 |
.. | import | 引入配置,比如etc下的一些rc文件,和java中的import差不多 |
.. | mkdir | 建立目录 |
.. | mount | 挂载文件系统 |
.. | setkey | 从源码看,应该是设置一个命令的关键字缩写,比如可以将domainname映射为dn |
.. | setprop | 设置一个属性 |
.. | setrlimit |
设置当前程序可以打开的最大文件数到系统规定程序可以打开的最大文件数 |
.. | start | 启动服务 |
.. | stop | 停止服务 |
.. | trigger | 不清楚,难道是自定义触发器? |
.. | symlink | 建立符号链接 |
.. | sysclktz |
设置基准时间 |
.. | wait | 等待文件准备好?Linux中这是进程调度的函数 |
.. | write | 向文件、设备写个什么东西。肯定不是传消息的那个wirte |
.. | copy | 不解释 |
.. | chown | 更改所有者 |
.. | chmod | 更改权限 |
.. | loglevel | Log输出级别,低于这个级别的就输出 |
.. | restart | 重启服务 |
OPTION | capability | 能力,也就是系统对进程的一种权限控制。 |
同上.. | class | 设置class name |
.. | console | 启用控制台 |
.. | critical | 是否关键,也就是4分钟之内重启超过4次的话,重启之后就进入recovery模式 |
.. | disabled | 不随class自动启动 |
.. | group | 组归属 |
.. | keycodes | 不明白。。。。。 |
.. | oneshot | 只启动一次,意外退出后不必重启 |
.. | onrestart | 重启时 |
.. | setenv | 增加环境变量 |
.. | socket | 申请socket资源 |
.. | user | 用户归属 |
.. | ioprio | io调度优先级 |
(很多属性与命令用法都与linux中同名命令差球不多)
init是分段(section)解析init.rc的,在keywords.h中可以查看关键字的定义。init是以什么标志来分段解析init.rc呢?结合init.rc的内容,可以看出,分段标记是以on 和 service来标记的。下面详细说明。
on 啥时候干什么
on属于行为。
on early-init
init之前、加载完所有rc文件后即执行,在miui的rom中,init.rc在early-init执行的是start ueventd,根据keywords.h的定义,start是个命令(COMMAND)。
这里顺便说下ueventd,android中底层(一般指驱动)通知上层的事件,用的是uevent,java层通过观察者模式实现,用到的类为 UEventObserver,使用intent来传递;native层用的是android_os_UEventObserver.cpp,使用uevent.c通过socket传递。当然,这是framework及以下的层面,一般开发不经常用到,更何况这几个类都没有被暴露出来。
on init
加载propety各项属性文件之前执行,在init变为propety service之前都属于init阶段。
on early-boot
启动属性service后即执行。
on boot
boot的时候执行。
on property:xxxxx=x
当某个属性设置为预期值时执行。
关于init.rc,其实结合/src/system/core/init/* 源码和init.rc文件来看,会明白许多。
=========
有时需要添加你自己增加的文件到root的时候,然后在init.rc修改文件的属性发现没有用,我也是折腾了半天,在网上看到有一个帖子:
create a script somewhere, for example, /system/bin/mymod.rc
#!/system/bin/sh
chmod 0777 /dev/mynode
add the following in /init.rc:
service mymod /system/bin/mymod.rc
oneshot
(注意表添加错了位置/system/bin/,是生成文件系统的system目录,不是root下的system目录)