正文

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语法的资料请关注Devmax其它相关文章!

Android 10 启动分析之init语法详解的更多相关文章

  1. ios – 为什么UIView同时调用init和initWithFrame?

    我注意到当我覆盖init和initWithFrame时:在UIView子类中,两个方法都被调用.即使在我的代码中只有一个是显式调用:TestViewController.m:View1.m:控制台看起来像这样:2013-10-1712:33:46.209test1[8422:60b]initWithFrame2013-10-1712:33:46.211test1[8422:60b]init为什么在

  2. Swift通过类名动态创建对象的方式

    一时并无法回答,因为一看到Swift中NSClassFromString返回的是AnyClass类型,而这个AnyClass类型为publictypealiasAnyClass=AnyObject.Type,这个Type具体是什么呢?当我们修改继承方式,把NSObject改成AnyObject,其结果也一样,AnyObject只是协议,遵守协议。总结:在Swift中,要创建对象有以下几种方式:1、Nsstring.self()//或者Nsstring.self.init()2、letmyClass=MyC

  3. Swift(十、类和结构体)

    实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。Swift管理所有的值拷贝以确保性能最优化,因此没必要去避免赋值以保证最有性能。

  4. swift3.0通过xib实现view

    swift3.0通过xib创建view时,一直crash仔细查找了一下找到一个坑爹得点现在总结出来避免再走弯路一、创建view类和对应的xib文件二、关联xib文件一定是关联file'sOwner上的customclass上。如果关联到view上就会报错三、加载对应的xib界面

  5. 字符串 – Swift init(count :, repeatedValue :)是否工作?

    看来你必须明确地将一个Character类型传递给它才能运行。这对我有用尽管如此,也可能存在与此相关的错误。我相信你这样做的方式本身应该是有效的。我似乎完全没有在这个初始化程序上完成代码。

  6. swift – 如何满足包含初始化程序的协议?

    )好的,我的坏为了保证所有子类符合MyProtocol,新的初始化器都必须被标记为必需的。此外,Swift要求在类中直接声明所有必需的初始值,并且不允许在扩展中声明它们。

  7. Android10开发者常见问题(小结)

    这篇文章主要介绍了Android10开发者常见问题(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. lazy init控制加载在Spring中如何实现源码分析

    这篇文章主要为大家介绍了lazy init控制加载在Spring中如何实现源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. Android10 客户端事务管理ClientLifecycleManager源码解析

    这篇文章主要介绍了Android10 客户端事务管理ClientLifecycleManager源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. Android10填坑适配指南(实际经验代码)

    这篇文章主要介绍了Android10填坑适配指南(实际经验代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部