.rc文件是 android系统一个十分重要的文件。
其是资源文件,包括比如对话框、菜单、图标、字符串等资源信息。
使用.rc资源文件的目的是为了对程序中用到的大量的资源进行统一的管理。 本文来了解文件的规则。
中间打个小广告,是本人的一个小小副业。
大家有需要各种品牌的鞋(耐克、阿迪、斐乐、vans、匡威等),都可以加下面这个微信号,性价比巨高,质量绝对可靠,自己穿的也都是这买的,到手不喜欢,不影响二次销售可直接退货,希望大家能多多支持(暂时不想买的也欢迎添加,首双优惠!),全国包邮!
vx:cp_shop12138
init.rc脚本是由Android中linux的第一个用户级进程init进行解析的。
init.rc 文件并不是普通的配置文件,而是由一种被称为“Android初始化语言”(Android Init Language,这里简称为AIL)的脚本写成的文件。
init.rc脚本包括了启动脚本文件,主要完成一些初级的初始化,文件系统初始化
主要是:
1)设置一些环境变量
2)创建system、sdcard、data、cache等目录(见案例1)
3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)设置一些文件的用户群组、权限
5)设置一些线程参数
6)设置TCP缓存大小
该文件在ROM中是只读的,即使有了root权限,可以修改该文件也没有。因为我们在根目录看到的文件只是内存文件的镜像。也就是说,android启动后,会将init.rc文件装载到内存。而修改init.rc文件的内容实际上只是修改内存中的init.rc文件的内容。一旦重启android,init.rc文件的内容又会恢复到最初的装载。想彻底修改init.rc文件内容的唯一方式是修改Android的ROM中的内核镜像(boot.img)。
如果想要修改启动过程只需要修改init.c(system/core/init)或者init.rc里的内容即可.
init.c与init.rc在源码中的位置分别位于如下:
1 init.c : /system/core/init
2 init.rc : /system/core/rootdir
主要包含了四种类型的语句:
1、Action
2、Services
Action和services显式声明了一个语句块
3、Commands
4、Options.
commands和options属于最近声明的语句块。
在第一个语句块之前 的commands和options会被忽略.
1、在init.rc文件中一条语句通常是占据一行。
2、单词之间是通过空格符来相隔的。
3、如果需要在单词内使用空格,那么得使用转义字符""。
4、末尾的反斜杠,是换行折叠符号,应该和下一行合并成一起来处。 理,与C语言中的含义是一致的。
5、以#号开头的为注释。
关键字位于语句块的首部,决定了这个语句块的种类
关键字 | 含义 |
---|---|
Action | 动作 |
trigger | 触发器。或者叫做触发条件. |
commands | 命令 |
services | 服务 |
在"动作"(action)里面的,on后面跟着的字符串是触发器(trigger),trigger是一个用于匹配某种事件类型的字符串,它将对应的Action的执行。
触发器(trigger)有几种格式:
1、最简单的一种是一个单纯的字符串。比如“on boot”。这种简单的格式可以使用命令"trigger"来触发。
2、还有一种常见的格式是"on property : <属性>=<值>"。如果属性值在运行时设成了指定的值,则"块"(action)中的命令列表就会执行。
常见的格式:
格式 | 含义 |
---|---|
on early-init | 在初始化早期阶段触发 |
on init | 在初始化阶段触发 |
on late-init | 在初始化晚期阶段触发 |
on boot/charger | 当系统启动/充电时触发 |
on property | 当属性值满足条件时触发 |
动作表示了一组命令(commands)组成.动作包括一个触发器,决定了何时运行这个动作。
注意:当触发器的条件满足时,这个动作会被增加到已被运行的队列尾。假设此动作在队列中已经存在,那么它将不会运行.
on <trigger> ## 触发条件
<command> ##执行命令
<command1> ##可以执行多个命令
示例:
源码来自:/device/rockchip/rk322x/init.rc
on property:vold.decrypt=trigger_encryption
start surfaceflinger
start encrypt
command是action的命令列表中的命令,或者是service中的选项 onrestart 的参数命令.
命令将在所属事件发生时被一个个地执行.
常见命令:
命令 | 功能 |
---|---|
exec |
运行指定路径下的程序,并传递參数. |
export |
设置全局环境參数。此參数被设置后对全部进程都有效. |
ifup |
使指定的网络接口"上线",相当激活指定的网络接口 |
hostname |
设置主机名 |
chdir |
改变工作文件夹. |
chmod |
改变指定文件的读取权限. |
chown |
改变指定文件的拥有都和组名的属性. |
chroot |
改变进行的根文件夹. |
class_start |
启动指定类属的全部服务,假设服务已经启动,则不再反复启动. |
class_stop |
停止指定类属的所胡服务. |
domainname |
设置域名 |
insmod |
安装模块到指定路径. |
mkdir |
用指定參数创建一个文件夹,在默认情况下,创建的文件夹读取权限为755.username为root,组名为root. |
mount |
类似于linux的mount指令 |
setprop |
设置属性及相应的值. |
setrlimit |
设置资源的rlimit(资源限制),不懂就百度一下rlimit |
start |
假设指定的服务未启动,则启动它. |
stop |
假设指定的服务当前正在执行。则停止它. |
symlink |
创建一个符号链接. |
sysclktz |
设置系统基准时间. |
write |
往指定的文件写字符串. |
服务是指那些须要在系统初始化时就启动或退出时自己主动重新启动的程序.
service <name><pathname> [ <argument> ]*
<option>
<option>
解释一下各个参数:
参数 | 含义 |
---|---|
表示此服务的名称 | |
此服务所在路径因为是可执行文件,所以一定有存储路径。 | |
启动服务所带的参数 | |
对此服务的约束选项 |
on property:sys.wifi.on=true
start gpio_read
service gpio_read /system/bin/gpio_read.sh
user root
group root
class main
disabled
oneshot
设置一个gpio_read服务对应可执行文件 gpio_read.sh脚本 。设置运行的user 和group,设置为不自动启动disabled,设置为退出之后不重启oneshot。
当属性 sys.wifi.on=true时,就会启动goio_read这个服务。
options是Service的修订项。它们决定一个服务何时以及如何运行.
选项 | 描述 |
---|---|
critical | 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。 |
disabled | 服务不会自动运行,必须显式地通过服务器来启动。 |
setenv | 设置环境变量 |
socket [ [ ] ] | 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket. |
user | 在执行此服务之前先切换用户名。当前默认为root. |
group [ ]* | 类似于user,切换组名 |
oneshot | 当此服务退出时不会自动重启. |
class | 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default. |
onrestart | 当服务重启时执行一条指令, |
# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys
write /proc/cpu/alignment 4
ifup lo
hostname localhost
domainname localhost
mount yaffs2 mtd@system /system
mount yaffs2 mtd@userdata /data
import /system/etc/init.conf
class_start default
service adbd /sbin/adbd
user adb
group adb
service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666
service runtime /system/bin/runtime
user system
group system
on device-added-/dev/compass
start akmd
on device-removed-/dev/compass
stop akmd
service akmd /sbin/akmd
disabled
user akmd
group akmd
源码路径system/core/init/init.cpp中:
parser.ParseConfig("/init.rc");
1、
on boot
系统启动时自动运行
2、
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
......
设置全局环境參数。此參数被设置后对全部进程都有效
之后执行以下一系列动作:创建对目录,挂接文件系统等
3、
service adbd /sbin/adbd
user adb
group adb
执行adbd /sbin/adbd 设置执行的用户
4、
class_start default
service adbd /sbin/adbd
user adb
group adb
给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default.
class_start default:则是启动该类下的所有服务
4、之后以此推类