Android源码之init.rc文件详解

  • Post author:
  • Post category:其他




一、引言

.rc文件是 android系统一个十分重要的文件。

其是资源文件,包括比如对话框、菜单、图标、字符串等资源信息。

使用.rc资源文件的目的是为了对程序中用到的大量的资源进行统一的管理。 本文来了解文件的规则。



小广告

中间打个小广告,是本人的一个小小副业。

大家有需要各种品牌的鞋(耐克、阿迪、斐乐、vans、匡威等),都可以加下面这个微信号,性价比巨高,质量绝对可靠,自己穿的也都是这买的,到手不喜欢,不影响二次销售可直接退货,希望大家能多多支持(暂时不想买的也欢迎添加,首双优惠!),全国包邮!

vx:cp_shop12138



二、Android中init.rc文件简单介绍

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 服务


1、触发器(trigger)

在”动作”(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 当属性值满足条件时触发


2、动作(Action)

动作表示了一组命令(commands)组成.动作包括一个触发器,决定了何时运行这个动作。


注意:当触发器的条件满足时,这个动作会被增加到已被运行的队列尾。假设此动作在队列中已经存在,那么它将不会运行.

on  <trigger>      ## 触发条件
    <command>      ##执行命令
    <command1>     ##可以执行多个命令


示例:


源码来自:/device/rockchip/rk322x/init.rc

on property:vold.decrypt=trigger_encryption
    start surfaceflinger
    start encrypt


3、commands(命令)

command是action的命令列表中的命令,或者是service中的选项 onrestart 的参数命令.

命令将在所属事件发生时被一个个地执行.

常见命令:

命令 功能
exec <path> [ ]* 运行指定路径下的程序,并传递參数.
export <name> <value> 设置全局环境參数。此參数被设置后对全部进程都有效.
ifup <interface> 使指定的网络接口”上线”,相当激活指定的网络接口
hostname <name> 设置主机名
chdir <directory> 改变工作文件夹.
chmod <octal-mode> <path> 改变指定文件的读取权限.
chown <owner> <group> <path> 改变指定文件的拥有都和组名的属性.
chroot <directory> 改变进行的根文件夹.
class_start <serviceclass> 启动指定类属的全部服务,假设服务已经启动,则不再反复启动.
class_stop <serviceclass> 停止指定类属的所胡服务.
domainname <name> 设置域名
insmod <path> 安装模块到指定路径.
mkdir <path> [mode] [owner] [group] 用指定參数创建一个文件夹,在默认情况下,创建的文件夹读取权限为755.username为root,组名为root.
mount<type> <device> <dir> [ <mountoption> ]* 类似于linux的mount指令
setprop <name> <value> 设置属性及相应的值.
setrlimit <resource> <cur> <max> 设置资源的rlimit(资源限制),不懂就百度一下rlimit
start <service> 假设指定的服务未启动,则启动它.
stop <service> 假设指定的服务当前正在执行。则停止它.
symlink <target> <path> 创建一个符号链接.
sysclktz <mins_west_of_gmt> 设置系统基准时间.
write <path> <string>\ [ <string> ]* 往指定的文件写字符串.



4、服务(services)

服务是指那些须要在系统初始化时就启动或退出时自己主动重新启动的程序.

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这个服务。



选项(option)

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 当服务重启时执行一条指令,



5、示例

# 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、之后以此推类



版权声明:本文为weixin_38019025原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。