专栏首页算法微时光Android系统启动之init.rc文件解析过程

Android系统启动之init.rc文件解析过程

什么是init.rc

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

rc规则

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

  1. Action
  2. Commands
  3. Services
  4. Options.

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

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

基本规则如下:

在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

当属性值满足条件时触发

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 <serviceclass>

启动指定类属的全部服务,假设服务已经启动,则不再反复启动.

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> Trigger an 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深入学习

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HIDL学习笔记之HIDL C++(第二天)

    HIDL 的远程过程调用 (RPC) 基础架构使用 Binder 机制,这意味着调用涉及开销、需要内核操作,并且可以触发调度程序操作。

    李小白是一只喵
  • 绘图[上](四)

    Android下绘图需要使用view.使用自定义的view完成绘制. 其中需要使用的有三个工具:Paint,Canvas,Path.

    李小白是一只喵
  • Android系统编译流程详解(三)

    其中定义了一个默认的droid,当我们在TOP目录下,敲Make实际上就等同于我们执行make droid。

    李小白是一只喵
  • 三个简单要素让你的微服务更有弹性

    基于Microservices(微服务)来构建分布式系统的优点之一是系统作为一个整体有能力能够承受错误和意外失败的组件、网络、计算资源等。这样的系统对错误更有弹...

    CSDN技术头条
  • python - sys模块

       sys.argv           命令行参数List,第一个元素是程序本身路径   sys.modules.keys() 返回所有已经导入的模块列表...

    py3study
  • iOS中Cocoa框架·Runtime及isa指针知识·填坑

    是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言;也不是开发工具,你可以在命令行上就可以创建Cocoa程序。Co...

    陈满iOS
  • 物联网和大数据趋势的赢家:云计算供应商

    物联网将推动对数据中心的大规模投资,但这些数据中心将由亚马逊、微软和谷歌运行。不难看出物联网(IoT)和大数据趋势的赢家:云计算供应商。根据IDC表示,在未来四...

    静一
  • 波士顿动力幸遇最强接盘侠,软银收购两家谷歌机器人公司

    【新智元导读】软银刚刚宣布,从 Google 母公司 Alphabet 收购两家机器人公司:大狗(Big Dog)的制造商波士顿动力和秘密的双足机器人公司 Sc...

    新智元
  • 【PostgreSQL架构】为什么关系型数据库是分布式数据库的未来

    大约10年前,我加入了Amazon Web Services,在那里我第一次看到了在分布式系统中进行权衡的重要性。在大学里,我已经了解了一致性和可用性之间的权衡...

    首席架构师智库
  • DC环境、设计规则和面积约束

    本文的主要内容是讲解(约束针对的是逻辑综合下的约束,而实战部分则是在DC的拓扑模式下进行):

    数字芯片社区

扫码关注云+社区

领取腾讯云代金券