Android 10 启动分析之init语法详解
作者:格子里的梦 发布时间:2022-03-12 05:07:16
init.rc脚本包含5种类型,Action(动作),Commands(命令), Services(服务),Options(选项), Imports(导入)。
以上这些都是基于“行”来解析的,并且用空格隔开关键字。
如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用""防止关键字被断开,另外需要注意/在末尾表示换行。
#开头表示注释。
可以使用语法 ${propertiesty.name}展开系统属性。这也适用于需要连接的上下文,如import /init.Recovery.${ro.hardware}.rc
。
当声明一个service或者action的时候,它将隐式声明一个section,它之后跟随的command或者option都将属于这个section。
Service的名称要保持唯一性。如果使用与现有Service相同的名称定义了第二个Service,则将忽略该Service并记录错误消息。
Actions
Action 指的是在某种条件下触发一系列的命令,通常有一个Trigger,用于确定何时执行操作。当与Action的Trigger匹配的事件发生时,该Action将被添加到待执行队列的尾部(除非它已经在队列上)。
Action的形式如下所示:
on <trigger> [&& <trigger>]*
<command>
<command>
<command>
Services
Services在特定选项的约束下被init程序运行或者重启,Service的格式如下所示:
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
参数解释:
name 表示此service的名称
pathname 此service所在路径。
argument 启动service所带的参数
option 对此service的约束选项。
Options
Options是Services的修饰符。它们影响init运行Services的方式和时机。
class <name> [ <name>\* ]
为该服务指定一个class名,同一个class的所有服务必须同时自动或者停止,默认情况下服务的class名是"default" 。
console [<console>]
这个Service需要一个控制台。可选的第二个参数选择一个特定的控制台,而不是默认的。可以通过设置androidboot.sole
内核参数来更改默认的/dev/console
。在所有情况下,都应该省略前面的/dev/
,因此/dev/tty0
将被写作console tty0
。
critical
表明这个Service对设备至关重要,如果Service在四分钟内退出超过4次,则设备将重启进入恢复模式。
disabled
此Service不会自动启动,需要通过显示调用Service名称来启动。
file <path> <type>
打开文件路径并将其FD传递给启动进程。类型必须是“r”、“w”或“RW”。
group <groupname> [ <groupname>\* ]
在启动服务将用户组切换至<groupname>
keycodes <keycode> [ <keycode>\* ]
设置将触发此服务的Keycodes。如果同时按下与传递的Keycodes对应的所有键,则服务将启动。这通常用于启动bugreport服务。
oneshot
当此Service退出时,不要主动去重启它。
onrestart
在重启时执行一条命令。
oom_score_adjust <value>
将子程序的/proc/Self/oom_Score_adj
设置为指定的值,该值必须在-1000到1000之间。
override
指示此Service用于覆盖先前定义的具有相同名称的Service。
priority <priority>
Service进程的调度优先级。此值必须在-20到19之间。默认优先级为0。
restart_period <seconds>
如果一个non-oneshot Service退出,它将在其启动时间的基础上加上这段时间后再重新启动,默认5s。对于打算定期运行的服务,可以增加此值。例如,它可以设置为3600表示服务应该每小时运行一次,或者86400表示服务应该每天运行。
setenv <name> <value>
设置启动环境变量。
shutdown <shutdown_behavior>
设置Service进程的关闭行为。如果未指定此操作,则通过SIGTERM和SIGKILL关闭Service进程。在关机期间,shutdown_behavior为“critical”的Service在shutdown超时之前不会被关闭。当shutdown超时时,即使标记为“shutdown critical”的Service也将被关闭。当执行shut down操作时,标记为“shutdown critical”的服务如果没有运行,它将被启动。
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
创建一个名为/dev/Socket/name的Unix域套接字,并将其FD传递给启动进程。类型必须是“dgram”、“stream”或“seqPacket”。用户和组默认为0。“secLabel”是套接字的SELinux安全上下文。
user <username>
表示将用户切换为<username>,当前默认为root。
Triggers
Triggers是可用于匹配某些类型的事件,并触发一个Action的字符串。
Triggers被细分为Event triggers
和Property triggers
。
Event triggers
是由init可执行文件中的trigger
命令或QueueEventTrigger()
函数触发的字符串。它们的形式是一个简单的字符串,比如boot
或late-init
。
Property triggers
是命名属性将值更改为给定的新值或命名属性将值更改为任何新值时触发的字符串。它们分别以Property:<name><value>
和Property:<name>=*
的形式出现。Property triggers
还会在init的初始启动阶段被触发。
一个Action可以有多个Property triggers
,但可能只有一个Event triggers
。
例如:
onboot&&properties:a=b
定义了一个只有当boot
Event triggers
发生并且属性a等于b时才执行的Action
。
on property:a=b && property:c=d
定义了一个执行三次的Action
:
在 initial boot 期间, 如果 property a=b 且 property c=d。
当property c已经等于d时,property a转换为b值。
当property a已经等于b时,property c转换为d值。
Commands
bootchart [start|stop]
start or stop bootchart,bootchart是用于记录开机时进程启动时间的工具。
chmod <octal-mode> <path>
更改文件访问权限。
chown <owner> <group> <path>
更改文件所有者和组。
class_start <serviceclass>
如果指定类的Service尚未运行,则启动它们。
class_stop <serviceclass>
如果指定类的Service正在运行,则停止并禁用它们。
class_reset <serviceclass>
如果指定类的Service正在运行,则停止它们,但是不禁用它们。它们可以使用class_start重新启动。
class_restart <serviceclass>
重新启动指定类的Service。
copy <src> <dst>
复制一份文件。通常用于二进制/大数据文件。
enable <servicename>
将disable的Service转换为enable的Service。如果Service应该被执行,它将立即启动。
exec [ <seclabel> [ <user> [ <group>\* ] ] ] -- <command> [ <argument>\* ]
用给定的参数fork并执行command。在这个command完成之前,不会运行其他命令。SecLabel可以用-来表示默认值。
mkdir <path> [mode] [owner] [group]
在PATH上创建一个目录,默认权限为755,并由root用户和root组拥有。
restart <service>
重启正在运行的Service。
start <service>
如果Service尚未运行,则启动该Service。请注意,这是异步的操作。
trigger <event>
触发一个Event。
write <path> <content>
打开路径为PATH的文件,并使用write()向其写入一个字符串。如果该文件不存在,则将创建该文件。
Imports
import <path>
解析init配置文件,扩展当前配置。如果PATH是一个目录,则该目录中的每个文件都被解析为一个配置文件,但它不是递归操作,嵌套目录不会被解析。
来源:https://juejin.cn/post/6998441504364560420/


猜你喜欢
- Java 匿名内部类详解匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用
- 比较简单的一个控件,就是加些逻辑处理而已,以前貌似是直接监听的,封装起来方便点public class AccountTxtView ext
- 1、装箱和拆箱是一个抽象的概念 2、装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型利用装箱和拆箱功能,可通过允许值类型的任何值
- 前言有位朋友,某天突然问东哥:在 Java 中,防止重复提交最简单的方案是什么?这句话中包含了两个关键信息,第一:防止重复提交;第二:最简单
- 一、二叉搜索树插入元素/** * user:ypc; * date:2021-05-18; * time: 15:09; */
- 下面是配置Android开发ADB环境变量的操作步骤。工具/原料win7系统电脑+Android SDK方法/步骤1.首先右击计算机——属性
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下首先来看一下我们要做成的而效果:主页面要显示一个view
- 一、简介ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:Task支持线程的
- 以下共有4个函数分别是:1.从剪切板获得文字。2.将字符串复制到剪切板。3.从剪切板获得图片。4.复制图片到剪切板。/** * 从剪切板获得
- 本文实例讲述了Android编程开发之在Canvas中利用Path绘制基本图形的方法。分享给大家供大家参考,具体如下:在Android中绘制
- 近期,公司推行正版化,本人使用的是JetBrains教育版,是不允许进行商业开发的,因此开启了艰难的备用IDE选型之路。最终,我选定了轻量级
- 概要: ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-P
- 本文实例讲述了Android开发中计算器的sin、cos及tan值计算问题。分享给大家供大家参考,具体如下:接到一个需求 :要求计算器sin
- 最近比较空闲没有项目做,于是乎捋了捋平时工作会遇到的一些常见问题,首先想到了多用户登录限制问题,下面就对此问题做一点思考讲解。
- 本文实例为大家分享了java编写的贪吃蛇源码,供大家参考,具体内容如下程序共包含以下两个文件:文件:ShellWin.javaimport
- 目录MeasureSpecLayoutParamViewViewGroupTextColumn使用总结
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下XML布局主页面main布局<com.handma
- 1.创建一个带Mesh的物体Unity中的网格作为组件不能脱离物体单独存在新建脚本CreateMeshpublic class Create
- 在Java中,当为一个类创建了多个构造函数时,有时想在一个构造函数中调用另一个构造函数以减少代码量。这时可以使用this关键字来实现。有关构
- 这篇文章主要介绍了springboot自定义异常视图过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需