Android系统启动:.rc文件

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

以init.rc为例。

.rc文件

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

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

  1. Action
  2. Commands
  3. Services
  4. 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>      ## 触发条件
<command> ##执行命令
<command1> ##可以执行多个命令

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

services(服务)

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

service <name><pathname> [ <argument> ]*
<option>
<option>

解释一下各个参数:

参数 含义
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) << "Parsing file " << path << "...";
Timer t;
std::string data;
if (!read_file(path, &data)) {
return false;
} data.push_back('\n'); // TODO: fix parse_config.
ParseData(path, data);
for (const auto& sp : section_parsers_) {
sp.second->EndFile(path);
} LOG(VERBOSE) << "(Parsing " << path << " took " << t << ".)";
return true;
}

参考

Android init.rc文件浅析

安卓系统启动--3init.rc解析

init.rc深入学习

Android系统启动:.rc文件的更多相关文章

  1. Android init.rc文件浅析

    Android init.rc文件浅析 分类: Android2012-04-13 18:00 13149人阅读 评论(2) 收藏 举报 androidservicepathactionsocketc ...

  2. Android init.rc解析【转】

    转自:http://www.linuxidc.com/Linux/2014-10/108438.htm 本文主要来自$Android_SOURCE/system/init/readme.txt的翻译. ...

  3. Android init.rc文件格式解析

    /***************************************************************************** * Android init.rc文件格式 ...

  4. Android中的 init.rc文件简介

    init.rc脚本是由Android中linux的第一个用户级进程init进行解析的. init.rc 文件并不是普通的配置文件,而是由一种被称为"Android初始化语言"(An ...

  5. init进程 && 解析Android启动脚本init.rc && 修改它使不启动android && init.rc中启动一个sh文件

    Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径:system/core/init,编译 ...

  6. android rc文件分析

    service vold /system/bin/vold \        --blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:bl ...

  7. Android修改init.rc和init.xx.rc文件【转】

    本文转载自:https://blog.csdn.net/u013686019/article/details/47981249 一.文件简介 init.rc:Android在启动过程中读取的启动脚本文 ...

  8. Android源码分析(十七)----init.rc文件添加脚本代码

    一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...

  9. android中init.rc文件的解析问题

    init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...

  10. Android系统启动顺序

    Android是一个基于Linux的开源操作系统.x86(x86是一系列的基于intel 8086 CPU的计算机微处理器指令集架构)是linux内核部署最常见的系统.然而,所有的Android设备都 ...

随机推荐

  1. 坐标轴调控大揭秘:Matplotlib坐标轴设置全攻略+顺口溜,一文掌握!

    在数据可视化的世界里,Matplotlib是那把魔法棒,让枯燥的数据跃然纸上,而掌控这把魔法棒的核心,就是对坐标轴的精妙操作.今天,就让我们一起揭开Matplotlib坐标轴设置的神秘面纱,配上易记的 ...

  2. VMware Workstation Pro各版本下载链接汇总(特全!!!)

    VMware Workstation Pro各版本下载链接汇总 (10.11.12.14.15.16官网全版本) 整理不易,点赞关注一下吧 工具软件:VMware Workstation Pro 1. ...

  3. 让.NET 8 支持 Windows Vista RTM

    众所周知,从 Windows 的每次更新又会新增大量 API,这使得兼容不同版本的 Windows 需要花费很大精力.导致现在大量开源项目已经不再兼容一些早期的 Windows 版本,比如 .NET ...

  4. sendmail发送慢的问题

    1.使用python的脚本,发送邮件.代码如下: 点击查看代码 [root@ZabbixServerMasterNode ~]# cd /etc/zabbix/alertscripts/ [root@ ...

  5. Surge多配置文件聚合配置方法

    目录 摘要 1. Surge配置原理 2. Surge托管配置 3. Surge多配置文件聚合配置 (1)找到配置文件 (2)编辑配置文件 参考 摘要 Surge 是一个在 macOS 和iOS 平台 ...

  6. chgrp chown

    chgrp 用来改变文件所属群组,如果要改变的群组不在/etc/group里面,将会报错. chown 用来改变文件的所有者,如果改变的所有者便在/etc/passwd里面,将会报错. 需要注意的是c ...

  7. C#.Net筑基-类型系统①基础

    C#.Net的BCL提供了丰富的类型,最基础的是值类型.引用类型,而他们的共同(隐私)祖先是 System.Object(万物之源),所以任何类型都可以转换为Object. 01.数据类型汇总 C#. ...

  8. 微信小程序校园跑腿系统怎么做,如何做,要做多久

    ​ 在这个互联网快速发展.信息爆炸的时代,人人都离不开手机,每个人都忙于各种各样的事情,大学生也一样,有忙于学习,忙于考研,忙着赚学分,忙于参加社团,当然也有忙于打游戏的(还很多),但生活中的一些琐事 ...

  9. 慢查询SQL优化

    记一次慢查询的SQL优化 测试表结构 MariaDB [shoppings]> desc login_userinfo; +------------+-------------+------+- ...

  10. go强大的垃圾回收机制。

    一.C语言中返回函数中局部变量值和指针(1) 在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空间,那为什么还可以返回局部变量 ...