转:http://h1372865100.blog.163.com/blog/static/2104291032012929114132327/
android的init.rc语法是独有的,可以说是一种语言吧。
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目录)