Android系统启动:.rc文件

您所在的位置:网站首页 安卓服务的含义 Android系统启动:.rc文件

Android系统启动:.rc文件

2023-11-09 15:51| 来源: 网络整理| 查看: 265

Android系统启动:.rc文件

reference : https://www.jianshu.com/p/a4c17f0110d0

以init.rc为例。

.rc文件

init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。

rc规则主要包含了四种类型的语句:

Action Commands Services Options.

Action和services显式声明了一个语句块,而commands和options属于最近声明的语句块。

在第一个语句块之前 的commands和options会被忽略.

基本规则如下(基本上与bash语法一样):

注释是以#开头。

在init.rc文件中一条语句通常是占据一行.

单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符"",

如果在一行的末尾有一个反斜杠,那么是换行折叠符号,应该和下一行合并成一起来处理,与C语言中的含义是一致的。

关键字 关键字 含义 token 在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。 Section 语句块,相当于C语言中大括号内的一个块。一个Section以Service或On开头.以Service开头的Section叫做服务而以On开头的叫做动作(Action). services 服务 Action 动作 commands 命令 options 选项 trigger 触发条件 class 类属,即能够为多个service指定一个同样的类属,方便操作同一时候启动或停止. Action(动作)

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

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

一个动作所包括的命令将被依次运行。

on ## 触发条件 ##执行命令 ##可以执行多个命令 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 当属性值满足条件时触发

例如:

on property:vendor.sys.boot_mode=normal write ${persist.vendor.mmi.misc_dev_path} "normal" on boot chown bluetooth bluetooth /sys/module/bluetooth_power/parameters/power chown bluetooth net_bt /sys/class/rfkill/rfkill0/type chown bluetooth net_bt /sys/class/rfkill/rfkill0/state chown bluetooth bluetooth /proc/bluetooth/sleep/proto commands(命令)

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

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

常见命令:

命令 描写叙述 exec [ ]* 运行指定路径下的程序,并传递參数 export 设置全局环境參数。此參数被设置后对全部进程都有效 ifup 使指定的网络接口"上线",相当激活指定的网络接口 import 导入一个额外的init配置文件 hostname 设置主机名 chdir 改变工作文件夹 chmod 改变指定文件的读取权限 chown 改变指定文件的拥有都和组名的属性 chroot 改变进行的根文件夹 `class_start `` 启动指定类属的全部服务,假设服务已经启动,则不再反复启动 class_stop 停止指定类属的所有服务 domainname 设置域名 insmod 安装模块到指定路径 mkdir [mode] [owner] [group] 用指定參数创建一个文件夹,在默认情况下,创建的文件夹读取权限为755username为root,组名为root. mount [ ]* 类似于linux的mount指令 setkey TBD(To Be Determined), 待定 setprop 设置属性及相应的值 setrlimit 设置资源的rlimit(资源限制),不懂就百度一下rlimit start 假设指定的服务未启动,则启动它 stop 假设指定的服务当前正在执行,则停止它 symlink 创建一个符号链接 sysclktz 设置系统基准时间 trigger 触发一个事件,Used to queue an action from another action. write [ ]* 往指定的文件写字符串 services(服务)

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

service [ ]*

解释一下各个参数:

参数 含义 name 表示此服务的名称 pathname 此服务所在路径因为是可执行文件,所以一定有存储路径。 argument 启动服务所带的参数 option 对此服务的约束选项 option(选项)

options是Service的修订项。它们决定一个服务何时以及如何运行.

选项 描述 critical 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。 disabled 服务不会自动运行,必须显式地通过服务器来启动。 setenv 设置环境变量 socket [ [ ] ] 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket. 用户名和组名默认为0 user 在执行此服务之前先切换用户名。当前默认为root. group [ ]* 类似于user,切换组名 oneshot 当此服务退出时不会自动重启. class 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default. onrestart 当服务重启时执行一条指令,

使用例子:

service bootanim /system/bin/bootanimation class core //给服务指定一个类属,这样方便操作多个服务同时启动或停止 user graphics //在执行此服务之前先切换用户名 group graphics audio disabled //服务不会自动运行 oneshot //当此服务退出时不会自动重启 rc文件实例 # 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 rc文件解析

源码路径system/core/init/init.cpp中:

parser.ParseConfig("/init.rc");

开始解析rc文件.

ParseConfig函数在文件core/init/init_parser.cpp140行:

bool Parser::ParseConfig(const std::string& path) { if (is_dir(path.c_str())) { return ParseConfigDir(path); } return ParseConfigFile(path); }

ParseConfigFile函数:

bool Parser::ParseConfigFile(const std::string& path) { LOG(INFO)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3