Android -- init.rc配置文件简介

android init language trigger触发条件分析 一下所有分析均基于最新安卓系统android-4.4源码: system/core/init/init.c: INFO("reading config file\n"); init_parse_config_file("/init.rc"); action_for_each_trigger("early-init", action_add_queue_tail); 阅读详情

Android -- init.rc配置文件简介

 

这篇文章的目的是记录近期从书中看到的内容,供后续查阅。

一个完整的init.rc脚本由四个部分组成:

  • Actions-动作
  • Commands-命令
  • Services-服务
  • Options-选项

它有一些通用的语法规则:

  • 注释以"#"开头
  • 关键字和参数以空格隔开,每个语句以行为单位
  • C语言风格的反斜杠转义字符("\")可以用来为参数添加空格
  • 为了防止字符串中的空格把其分隔成多个部分,我们需要对其使用双引号
  • Actions和Services暗示着一个新语句的开始,这两个关键字后面跟着的commands或者options都属于这个新语句
  • Actions和Services有唯一的名字,如果出现和已有动作或服务重名的,将会被当做错误忽略掉

init.rc文件是以块(section)为单位组织的,一个“块”可以包含多行。“块”分成两大类:一类称为“action(行为)”;另一类称为“service(服务)”。“行为”块以关键字“on”开始,表示一堆命令的集合,“服务”块以“service”开始,表示启动某个进程的方式和参数。“块”以关键字“on”或“service”开始,直到下一个“on”或“service”结束,中间所有行都属于这个“块”(空行或者注释都不具备分割作用)。
init.rc中注释以“#”号开始,下面是一部分.rc文件示例:

eg:
on boot
    # basic network init
    ifup lo
    hostname localhost
    domainname localdomain
on property:sys.boot_from_charger_mode=1 // a
    class_stop charger
    trigger late-init // b
on nonencrypted
    class_start main
    class_start late_start
service installd /system/bin/installd
    class main
    socket installd stream 600 system system
on load_persist_props_action
    load_persist_props
    start logd // c
    start logd-reinit // d

无论是“action”块还是“service”块,它们的执行顺序都与.rc文件中的声明顺序无关;是否执行及执行顺序要由init进程在运行时决定。

“action”的关键字“on”后面跟的字符串我们称之为“trigger(触发器)”,如上面的“boot”、“nonencrypted”,“trigger”后面的内容是命令列表。命令列表中的每一行都是一条命令,命令的种类非常多。
“行为”块的一般格式如下:

on <trigger>
   <command>
   <command>
   <command>

“trigger”有多种格式,最简单的一种是一个单纯的字符串。这种简单的格式可以使用命令“trigger”来触发,如标记b处所示。另外一种常见的格式是“on property:<property>=<value>”,如标记a处所示,如果property值在运行时设定成了这里指定的值,如“1”,则“块”中的命令列表就会执行。

“service”块的关键字“service”后面的字符串是服务名称。我们可以使用“start”命令加“服务名称”来启动一个服务,如标记c、d处。服务名称后面是进程的可执行文件路径和要传递的启动参数。
“服务”块的一般格式如下:

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

关键字“service”以下的行称为“option(选项)”,选项也有很多种。常见的如“class”表示服务所属的类别;“class_start”可以同时启动一组服务。

上面的内容只是大概介绍了init.rc的文件格式,下面着重介绍init脚本的关键字定义

Android的rc脚本语言包含了4中类型的声明:Actions、Commands、Services和Options。所有这些都以行为单位,各种符号则由空格隔开。C语言风格的反斜杠可用于在符号间插入空格。双引号可用于防止字符串被空格分割成多个记号。行末的反斜杠用于折行。注释以“#”开头(运行以空格开头)。

Action和Service声明一个新的分组。所有命令或选项都属于最近申明的分组。位于第一个分组之前的命令或选项将被忽略。

Action其实就是一系列的Command集合。每个Action都有一个trigger,它决定本Action的执行时机。当一个符合Action触发条件的事件发生了,此Action会加入到执行队列的末尾(除非它已经在队列里了)。每一个Action都将依次从队列中取出,此Action的每个Command都将依次执行。在这些命令执行时Init还会同时处理着其他活动(创建设备节点、设置属性、重启进程等)。

Service则是一个后台程序,在Init中启动。

接着就来介绍下“action”和“service”中要使用到的关键字的具体定义:Options、Triggers和Commands。

 

Options

 

Options是Service的修订项,它们决定一个Service何时以及如何运行。

  • critical:表示这是一个关键的服务。如果该Service4分钟内重新启动超过4次,系统将自动重启并进入recovery模式。
  • disabled:表示服务不能通过start className(main/core等)启动。它必须以命令“start service_name”的形式显示指定名称启动。
  • setenv <name> <value>:在Service启动时将环境变量“name”设置为“value”。
  • socket <name> <type> [<user> [<group>]]:创建一个名为/dev/socket/<name>的套接字,并把文件描述符传递给要启动的进程。<type>的值是“dgram”或者是“stream”,User和group的值默认为0。
  • user <username>:在启动这个Service前设置Service的用户名,默认是root。如果进程没有相应的权限,将不能使用该命令。如果进程有root权限,可以在程序中设置你想要的uid。
  • group <groupname> [<groupname>]*:在启动这个Service前设置Service的服务。除了第一个组名,剩下的组名同城用于设置进程的附加组(通过setgroups())。默认是root。
  • oneshot:Service退出后不再重启。
  • class <name>:给Service指定一个名字。所有同名字的服务可以同时启动和停止。如果不通过class选项指定一个名字,则默认是“default”。
  • onrestart:当Service重启时,执行一条命令。
  • writepid <file...>:将当前进程的进程号写到<file...>文件中。

 

Triggers

 

Triggers是一个用于匹配某种事件类型的字符串,它将使对应的action执行

boot是Init执行后第一个触发的Trigger(在/init.conf装载之后)。

  • <name>=<value>:这种形式的Trigger会在属性"name"设置为指定的“value”时被触发。
  • device-added-<path>,device-removed-<path>:这种形式的Trigger会在一个设备文件增加或移除时触发。
  • service-exited-<name>:这种形式的Trigger会在一个指定的Service退出时触发。

 

Commands

 

Commands是Action的命令列表中的命令,或者是Service的选项onrestart的参数命令。

  1. exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]*:fork和启动一个程序,在程序完成启动之前,Init进程将会阻塞。command跟在“--”之后,在这之前我们可以指定像安全上下文、用户名和组名这样的参数信息;seclabel默认指定为“-”。
  2. export <name> <value>:设置全局环境变量<name>为<value>(所有在这命令执行之后运行的进程都将继承该环境变量)。
  3. ifup <interface>:启动网络接口<interface>。
  4. import <filename>:引入一个配置文件,扩展当前配置。
  5. hostname <name>:设置主机名。
  6. chdir <directory>:设置进程当前的工作目录。
  7. chmod <octal-mode> <path>:设置文件或目录的访问权限。
  8. chown <owner> <group> <path>:设置文件或目录的所有者和组。
  9. chroot <directory>:设置进程的根目录。
  10. class_start <serviceclass>:启动所有指定服务名称下的未运行服务。
  11. class_stop <serviceclass>:停止所有指定服务名称下的已运行的服务。
  12. domainname <name>:设置域名。
  13. insmod <path>:安装一个驱动模块。
  14. mkdir <path> [mode] [owner] [group]:新创建一个目录<path>,可以指定访问权限、拥有者和组。如果没有指定,默认的访问权限是755,属于root用户和root组。
  15. mount <type> <device> <dir> [ <mountoption>]*:在指定目录下挂载一个设备。<device>可以是以mtd@name的格式指定的一个mtd块设备。<mountoption>包括“ro”、“rw”、“remount”、“noatime”等。
  16. restorecon <path>:重新存储指定的文件到一个有file_contexts配置的安全上下文。不用指定目录,它们会被Init进程自动创建。
  17. setcon <securitycontext>:设置当前进程的安全上下文为指定的串。主要用在early-init中去设置Init的安全上下文。
  18. setenforce 0|1:设置SELinux系统级的enforcing状态。0代表permissive,1代表enforcing。
  19. setkey:目前未使用。
  20. setprop <name> <value>:设置系统属性<name>为<value>值。
  21. setrlimit <resource> <cur> <max>:设置<resource>的rlimit值。
  22. setsebool <name> <value>:设置SELinux的boolean型属性<name>的值为<value>。<value>的值可以是“1|true|on"或者”0|false|off“。
  23. start <service>:启动指定服务(如果此服务还未运行)。
  24. stop <service>:停止指定服务(如果此服务还在运行中)。
  25. symlink <target> <path>:创建一个符号连接。
  26. sysclktz <mins_west_of_gmt>:设置系统的时钟基准(0代表格林尼治平均时(GMT)为准)。
  27. trigger <event>触发一个事件。用于将一个Action和另一个Action连在一起执行。
  28. wait <path> [<timeout>]:等待指定路径的文件被创建出来,创建完成就停止等待,或者等到超时时间到达。如果未指定超时时间,缺省时间是5秒。
  29. write <path> <string> [<string]*:打开指定的文件,并写入一个或多个字符串。

 

更详细的字段定义可以查看/system/core/init/readme.txt文本中的官方介绍。
待续......

 

 

 

 

 

 

 

 

 

 

Android源码之init.rc文件详解 一、引言 .rc文件是 android系统一个十分重要的文件。 其是资源文件,包括比如对话框、菜单、图标、字符串等资源信息。 使用.rc资源文件的目的是为了对程序中用到的大量的资源进行统一的管理。 本文来了解文件的规则。 二、init.rc Android init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。 三、文件规则 类型 主要包含了四种类型的语句: 1、Acti... 阅读详情

相关推荐

Android启动初始化init.rc详解

一张图简单阐述一下(网络图片,侵删)Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些与内核空间交互的文件都在用户空间,所以在Linux内核装载完,需要首先建立这些文件所在的目录。而完成这些工作的程序就是本文要介绍的init。Init是一个命令行程序。其主要工作之一就是建立这些与内核空间交互的文件所在的目录。当Linux内核加载完后,要做的第一件事就是调用init程序,也就是说,init是用户空间执行的第一个程序。

fcf1990501的专栏 1239

Android系统init进程启动及init.rc全解析

这是一篇用心写的博客,也希望大家用心看并帮忙找到文章的改进之处,谢谢;服务启动机制 system/core/init/init.c文件main函数中parse_config_file(init.rc)读取并解析init.rc文件内容。将service信息放置到system/core/init/init_parser.cpp的service_list中 system/core/init/init.c文

zhonglunshun的专栏 7万+

Android init.rc的启动流程

Android 系统的启动过程分为几个主要阶段,每个阶段负责不同的初始化任务。在 Android 启动时,init程序是第一个运行的用户空间进程。init负责启动系统服务、挂载文件系统、设置权限等任务。init.rc是init程序的配置文件,定义了这些启动任务和服务的详细信息,文件中的指令会按照特定的顺序执行来完成这些任务。

netwalk的专栏 2422

Android 12 init流程分析

刚开始接触需要了解的概念理解过程遇到了什么问题代码的位置和流程分析如何分析和调试遇到的问题。

dawnminghuang的专栏 1957

android init进程解析init.rc过程

开发板:samsung-exynos4412,android4.0.4 调试android设备驱动时经常需要修改init.rc和init.hardware.rc文件,init.rc经常修改,然而里面定义的trigger事件执行,谁先谁后一直没有特别在意,跟踪代码之后做个小结 文件路径:/system/core/init/*.*,里面有个readme.txt文件详细说明了Android init

uranus_wm的专栏 6842

Android读取init.rc配置文件parse_config函数解析

Android源代码版本:4.0.3 static void parse_config(const char *fn, char *s)函数在Android的init程序启动过程中用于解析init.rc文件。init.rc文件是安卓系统的初始化文件,其中的内容可以分为三大类: 1. Action:一个action表示一个动作,以关键字on作为开头,并加上action的名称,接下来的是对应于这个

a364572的专栏 2184

安卓11 init初始化以及init.rc的解析执行过程详解

最近做了一个高通平台安卓的需求,功能使得data分区在第一次启动时,自动适配emmc/ufs的实际大小,在此过程中对init的执行以及.rc文件的解析流程有了一些理解,趁热打铁!!在这里总结一下!!! 这里以mtk平台为例进行说明,基于安卓11,init这块的代码mtk与高通基本是一模一样的,都是中间层的东西; 对于init在整个系统中(宏观)的执行流程想必大家都很清楚了,init进程是linux内核启动后创建的第一个进程,地位非常重要,init进程在初始化过程中会启动很...

w346665682的博客 1万+

Android系统 init.rc文件详解

在这篇博客中,深入探讨了Android系统中的init.rc文件,这是Android系统启动和运行的关键部分。详细解析了init.rc文件中的命令和动作,包括内置命令,外部命令,属性触发器和事件触发器,并且详细介绍了它们的使用和定义。还讨论了Android 11++中init.rc文件的执行顺序,以及如何根据系统属性和事件来定义和触发动作。这篇博客对于理解和控制Android系统的启动和运行过程非常有帮助。

我其实什么都不会 5532

Android Init Language(RC文件)介绍

Android Init Language介绍基本概念什么是rc文件?Android Init进程用rc做了什么?相关内容Android RC文件应用Android rc文件语法解析Line-oriented语法组成ActionServicesOption和CommandTriggerimport 基本概念 什么是rc文件? rc文件,是用Android Init Language编写的特殊文件。用这种语法编写的文件,统一用".rc"后缀。 所有rc文件,不会被编译/链接。它是配置文件,不是程序,是一种用于

林多 4158

ANSYS MAXWELL内置式永磁同步电机(IPMSM)转矩最大时输入电流相位的确定

1.在转子转速为零时看一个周期内的转矩变化

qq_41752507的博客 6516

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。

由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu...

AIGIS的博客 1万+

Android init.rc启动顺序

kernel启动完成,最后启动init进程,init进程中解析init.rc. int main(int argc, char** argv) { open_console(); if (!strcmp(basename(argv[0]), "ueventd")) { return ueventd_main(argc, argv); } if (!...

osnet的博客 1975

用Pixel5玩转AOSP:从零开始定制Android13系统(含GMS集成方案)

本文提供了一份详尽的Pixel 5 AOSP定制指南,涵盖从环境搭建、源码下载、系统编译到刷机的完整流程。重点解决了原生AOSP缺失Google移动服务(GMS)的难题,分享了从官方镜像提取并集成GMS组件的实战方案,助你打造独一无二的Android 13系统。

sam99的博客 527

Android14 init.environ.rc详解

init.environ.rc中主要是在on early-init阶段执行由export指令设置全局环境变量,为后续系统服务、zygote、应用程序运行提供路径和配置基础。

lvyaer_1122的博客 980

300Kg载重履带式无人车底盘定制开发技术详解

通过精准的需求分析、科学的方案设计、严格的研发与测试以及完善的交付与培训流程,可以打造出符合客户需求的优质产品。300Kg载重履带式无人车底盘的定制开发,旨在打造一款承载能力强、行驶稳定、适应复杂地形的无人运输平台。根据应用场景选择合适的动力源,并进行性能优化,确保无人车在载重情况下仍能保持稳定的行驶速度和动力输出。根据需求分析结果,设计无人车底盘的总体方案,包括动力系统选择、结构设计、负载管理策略等。进行详细的研发工作,包括零部件的选型与采购、样机的制作与调试等。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 958

01 ArcGIS空间分析--水文分析--利用水文分析方法提取山谷山脊线

ArcGIS空间分析的一个特别好的分析教程是汤国安老师的空间分析的内容。 实例与练习 练习1. 利用水文分析方法提取山脊、山谷线 1. 背景:山脊线、山谷线是地形特征线,它们对地形、地貌具有一定的控制作用。它们与山顶点、谷底点以及鞍部点等一起构成了地形及其起伏变化的骨架结构。因此在数字地形分析中,山脊线和山谷线以及

Meditation 1万+

安卓init启动流程及rc

最近写一个native services,顺便学习了一下启动流程。看见了这个帖子说的很到位,赶紧分享一下。

witch23333的博客 942

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 192

Android mk文件 LOCAL_INIT_RC 将RC文件编译到/system/etc/init或vendor/etc/init,system\core\init\init.cpp解析这些rc

一、看下面的Android.mk 的,里面有个LOCAL_INIT_RC,那这个什么意思呢? 二、编译宏LOCAL_INIT_RC用于将服务相关的RC文件编译到相应位置。上面的Android.mk通过LOCAL_INIT_RC将对应的batterywarning.rc编译到/system/etc/init目录中。 三、 来看一下batterywarning.rc,可以看出sys.boot_completed等于1的时候就执行这个bin文件。 四,那在哪里解析这个rc文件呢?这个问题...

海月汐辰 5848

TGAT Python:图神经网络中的动态图算法

其中,图神经网络中的动态图算法成为了研究的热点之一。在模型的 forward 方法中,通过循环调用 TGATLayer 实例来进行图神经网络的前向传播。最终,模型返回图中节点的表示向量 output,可以用于图分类等任务。TGAT 算法的核心思想是在节点之间建立注意力连接,以捕捉节点在不同时间步之间的关系。TGAT 算法通过引入注意力机制和时间信息,从而有效地对动态图数据进行建模和分析。通过以上 Python 代码,我们可以方便地构建和训练 TGAT 模型,并在图分类任务中应用它。

2301_79366435的博客 1827

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 910

【开发日常】【init.rc】--Android 修改 init.rc配置

因为某些特殊的逻辑,希望启动的时候不去打开开机动画等服务。 之前也提到过开机动画的替换,只需要在"/system/media"目录下去更改bootanimation.zip就好了。 其中一些更细致的内容,比如desc.txt等配置,其他博客里会提到。 安卓制作开机动画 本次主要研究的如何完全关闭开机动画、开机铃声等。 开机动画的逻辑之前也研究过。 在系统启动时,会自动执行R......

诸葛一帆丶的博客 6888

MATLAB图像语义分割实例(道路语义分割)

本教程利用MATLAB进行图像语义分割,从语义分割概念、模型搭建、图像标记、模型测试完整的展示了MATLAB语义分割的全过程。(本博主提供一对一技术支持服务,有需要的同学可以私信我哦)

Android14 init.rc详解1

init.rc的代码目录在//,该文件是由init进程解析,来初始化和启动PropertyService,启动zygote和servicemanager进程。

lvyaer_1122的博客 1393

用 Python 和 Pygame 制作《星露谷物语》游戏及源码(毕业设计/课程设计/项目开发)

使用 Python 和 Pygame 开发《星露谷物语》游戏,适合毕业设计、课程设计、项目开发。项目源码经过严格测试,可放心参考并在此基础上扩展。项目简介:这是使用 Python 和 Pygame 开发《星露谷物语》游戏,包含耕作和觅食、昼夜循环、天气影响和商人等功能。该游戏使用 Tiled 制作,可自行扩展。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

机械课设毕设-轻型载重汽车转向桥桥总成CAD图纸+设计说明书文档.zip

机械课设毕设-轻型载重汽车转向桥桥总成CAD图纸+设计说明书文档从动桥即非驱动桥,又称从动车桥。它通过悬架与车架(或承载式车身)相联,两侧安装着从动车轮,用以在车架(或承载式车身)与车轮之间传递铅垂力、纵向力和横向力。从动桥还要承受和传递制动力矩。根据从动车轮能否转向,从动桥分为转向桥与非转向桥。一般汽车多以前桥为转向桥。为提高操纵稳定性和机动性,有些轿车采用全四轮转向。多轴汽车除前轮转向外,根据对机动性的要求,有时采用两根以上的转向桥直至全轮转向。 一般载货汽车采用前置发动机后桥驱动的布置形式,故其前桥为转向从动桥。轿车多采用前置发动机前桥驱动,越野汽车均为全轮驱动,故它们的前桥既是转向桥又是驱动桥,称为转向驱动桥。 从动桥按与其匹配的悬架结构的不同,也可分为非断开式与断开式两种。与非独立悬架相匹配的非断开式从动桥是一根支承于左、右从动车轮上的刚性整体横梁,当又是转向桥时,则其两端经转向主销与转向节相联。断开式从动桥与独立悬架相匹配。

android init进程 init.rc

Init进程是android系统起来之后启动的第一个进程,代码入口在 system/core/init/init.c main() 函数。 关于init进程,请参考 Android Init进程分析:blog.csdn.net/justmantao/article/details/8751810?utm_source=tuicool 参考:Android启动过程深入解析:

kingodcool的专栏 713

华为HUAWI_html.tar

华为光猫V5R020英文固件版HTML文件包HS8546X6,HS8145X6,HS8346X6,K662C的英文HTML文件包

上一篇: Android -- Android设备的启动流程概述
下一篇: Android -- Android Init进程的处理流程分析
第一序列丶
博客等级 码龄11年 249粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值