Android 10 启动分析之init语法详解

目录
  • 正文
  • Actions
  • Services
  • Options
  • Triggers
  • Commands
  • Imports

正文

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 triggersProperty triggers

Event triggers是由init可执行文件中的trigger命令或QueueEventTrigger()函数触发的字符串。它们的形式是一个简单的字符串,比如bootlate-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> [ &lt;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是一个目录,则该目录中的每个文件都被解析为一个配置文件,但它不是递归操作,嵌套目录不会被解析。

以上就是Android 10 启动分析之init语法详解的详细内容,更多关于Android 10 启动init语法的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android init.rc文件简单介绍

    Android init.rc文件简单介绍 init.rc脚本是由Android中linux的第一个用户级进程init进行解析的. init.rc 文件并不是普通的配置文件,而是由一种被称为"Android初始化语言"(Android Init Language,这里简称为AIL)的脚本写成的文件. 该文件在ROM中是只读的,即使有了root权限,可以修改该文件也没有.因为我们在根目录看到的文件只是内存文件的镜像.也就是说,android启动后,会将init.rc文件装载到内存.而修改

  • 深入剖析Android中init进程实现的C语言源码

    概述 init是一个进程,确切的说,它是Linux系统中用户空间的第一个进程.由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程.init的进程号是1.作为天字第一号进程,init有很多重要的工作: init提供property service(属性服务)来管理Android系统的属性. init负责创建系统中的关键进程,包括zygote. 以往的文章一上来就介绍init的源码,但是我这里先从这两个主要工作开始.搞清楚这两个主要工作是如何实现的,我

  • Android miniTwitter登录界面开发实例

    本文要演示的Android开发实例是如何完成一个Android中的miniTwitter登录界面,下面将分步骤讲解怎样实现图中的界面效果,让大家都能轻松的做出美观的登录界面. 先贴上最终要完成的效果图: miniTwitter登录界面的布局分析 首先由界面图分析布局,基本可以分为三个部分,下面分别讲解每个部分. 第一部分是一个带渐变色背景的LinearLayout布局,关于背景渐变色就不再贴代码了,效果如下图所示: 第二部分,红色线区域内,包括1,2,3,4 如图所示: 红色的1表示的是一个带圆

  • Android Init进程对信号的处理流程详细介绍

    Android  Init进程对信号的处理流程 在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号.父进程收到该信号后,会释放分配给该子进程的系统资源:并且父进程需要调用wait()或waitpid()等待子进程结束.如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全退出.这样的子进程不能被调度,所做的只是在进程列表中占据一个

  • Android中init.rc文件的解析 分享

    对init.rc的解析是在parse_config(): [system/core/init/init_parser.c]中进行的.解析发生在init全过程中的哪个阶段,参看<Android init进程启动过程分析>. 一.解析过程 1.      扫描init.rc中的token 找到其中的 文件结束EOF/文本TEXT/新行NEWLINE,其中的空格' '.'\t'.'\r'会被忽略,#开头的行也被忽略掉: 而对于TEXT,空格' '.'\t'.'\r'.'\n'都是TEXT的结束标志.

  • Android init.rc文件详解及简单实例

    Android init.rc文件详解 本文主要来自$ANDROID_SOURCE/system/init/readme.txt的翻译. 1 简述 Android init.rc文件由系统第一个启动的init程序解析,此文件由语句组成,主要包含了四种类型的语句:Action,Commands,Services,Options.在init.rc文件中一条语句通常是占据一行.单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符"\",如果在一行的末尾有一个反斜杠,那么

  • Android 10 启动分析之init语法详解

    目录 正文 Actions Services Options Triggers Commands Imports 正文 init.rc脚本包含5种类型,Action(动作),Commands(命令), Services(服务),Options(选项), Imports(导入). 以上这些都是基于“行”来解析的,并且用空格隔开关键字. 如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用""防止关键字被断开,另外需要注意/在末尾表示换行. #开头表示注释. 可以使用语法 ${p

  • Android Activity启动模式之singleTop实例详解

    本文实例讲述了Android Activity启动模式之singleTop.分享给大家供大家参考,具体如下: 在前面文章<Android Activity启动模式之standard实例详解>中,我们介绍了活动的默认启动模式standard,本文继续介绍Activity的singleTop模式. singleTop模式:当Activity的活动模式设置为singleTop时,在启动活动时首先检查栈顶活动是否是该活动,如果是,在使用当前实例,否则继续创建新的实例. (1)修改AndroidMani

  • Android Activity启动模式之singleTask实例详解

    本文实例分析了Android Activity启动模式之singleTask.分享给大家供大家参考,具体如下: 前面的文章介绍了Android 活动Activity的启动模式:standard 和singleTop .本文继续介绍Activity的下一个启动模式:singleTask. singleTask:当设置活动的启动模式为singleTask时,首先检查返回栈中是否存在当前活动,如果存在当前活动的实例,则直接使用当前实例,并把当前活动之上的所有活动pop出栈,即当前活动位于栈顶位置. 代

  • Android Activity启动模式之standard实例详解

    本文实例讲述了Android Activity启动模式之standard.分享给大家供大家参考,具体如下: Android的活动是通过任务Task来进行管理的,一个任务就是一组放在栈里的活动的集合,即所谓的返回栈(Back Stack).栈具有先进后出.后进先出的特性.当启动一个活动时,活动会在返回栈中入栈,处于栈顶位置,当按下返回键或者调用finish方法会销毁一个活动,此时栈顶活动会出栈,届时又会有新的活动处于栈顶位置. 在Android中,活动的启动模式有四种,根据不同的需求可以为活动设置

  • Android Handler leak分析及解决办法详解

    Android Handler leak 分析及解决办法 In Android, Handler classes should be static or leaks might occur, Messages enqueued on the application thread's MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be ret

  • Android 10 启动Init进程解析

    目录 按下电源键时,android做了啥? init进程解析 FirstStageMain SetupSelinux SecondStageMain init.rc 解析 按下电源键时,android做了啥? 当我们按下电源键时,手机开始上电,并从地址0x00000000处开始执行,而这个地址通常是Bootloader程序的首地址. bootloader是一段裸机程序,是直接与硬件打交道的,其最终目的是“初始化并检测硬件设备,准备好软件环境,最后调用操作系统内核”.除此之外,bootloader

  • Android 10 启动之servicemanager源码解析

    目录 正文 获取服务 注册服务 正文 上一篇文章: Android 10 启动分析之Init篇 (一) 在前文提到,init进程会在在Trigger 为init的Action中,启动servicemanager服务,这篇文章我们就来具体分析一下servicemanager服务,它到底做了哪些事情. servicemanager服务的源码位于/frameworks/native/cmds/servicemanager/service_manager.c,我们将从这个类的入口开始看起. int ma

  • Android Kotlin开发实例(Hello World!)及语法详解

    Android Kotlin开发实例及语法详解 前言 Kotlin是一种在 Java虚拟机上执行的静态型别编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言.该语言有几个优势 1. 简洁 它大大减少你需要写的样板代码的数量. 2. 安全 避免空指针异常等整个类的错误. 3. 通用 构建服务器端程序.Android 应用程序或者在浏览器中运行的前端程序. 4. 互操作性 通过 100% Java 互操作性,利用 JVM 既有框架和库. 配置 在我们的AndroidS

  • Android开发App启动流程与消息机制详解

    目录 引言 1.第一步了解 ThreadLocal 2.App的启动流程 3.Activity中创建Handler 引言 相信很多人对这个问题不陌生,但是大家回答的都比较简单,如谈到app启动流程有人就会是app的生命周期去了,谈到消息机制有人就会说looper循环消息进行分发,如果是面试可能面试官不会满意,今天我们搞一篇完善的源码解析来进行阐述上面的问题 1.第一步了解 ThreadLocal 什么是ThreadLocal呢,专业的来讲,ThreadLocal 是一个线程内部的数据存储类,通过

  • Android Studio下的APP目录结构详解

    Project Name:工程项目名称 Application Name:当前应用发布以后的名字,例如QQ图标下面的名字是"QQ",就是Application Name. Android Studio工程目录 1..gradle和.idea 这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去手动编辑. 2.app 项目中的代码.资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的,待会儿还会对这个目录单独展开进行

随机推荐