上一篇: <Android init介绍(上)>

5. AIL

在init启动过程中,系统服务等均是通过解析rc文件来启动,而rc文件则是由Android初始化语言(Android Init Language)的脚本写成

5.1 格式介绍

AIL以Section为区分,由如下import、action和service三类Section

5.1.1 import section

主要用于导入其他rc文件

import <path>

上面的命令将导入path指定的文件然后被解析为action和service

5.1.2 action section

action section由trigger和一些command组成
以on开头,trigger是判断条件,command是具体执行一些操作;当满足trigger条件时,执行这些command

格式如下

on <trigger> [&& <trigger>]*
<command>
<command>
<command>

trigger的内容包含如下

/*
* 事件触发器
* -- 表示当trigger early或QueueEventTrigger("early")调用时触发
*/
on early /*
* 属性触发器
* -- 表示当sys.boot_from_charger_mode的值通过property_set设置为1时触发
*/
on property:sys.boot_from_charger_mode= /*
* 多个条件用&&连接
* -- 表示当zygote-start触发并且ro.crypto.state属性值为unencrypted时触发
on zygote-start && property:ro.crypto.state=unencrypted

command就是一些具体的操作,由BuiltinFunctionMap::Map(builtin_functions)定义来执行特定的操作

    // 终止charger服务
class_stop charger
// 开启watchdogd服务
start watchdogd
// 触发late-init
trigger late-init

5.1.3 service section

service section由service加上一些option组成
以service开头,name是为服务名称,pathname为服务的执行文件路径,argument表示执行文件带的参数,option表示这个服务的一些配置,optionOptionParserMap::Map(option_parsers)定义

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

5.2 文件解析

/*
* 初始化Subcontext
*/
InitializeSubcontexts()
SelinuxHasVendorInit()
Subcontext::Subcontext()
Subcontext::Fork()
fork()
execv("/init", {"/init", "subcontext", "u:r:vendor_init:s0", fd, nullptr}) // 创建ActionManager实例
ActionManager::GetInstance()
// 创建ServiceList实例
ServiceList::GetInstance() LoadBootScripts()
CreateParser(ActionManager, ServiceList)
Parser::ParseConfig("/init.rc")
Parser::ParseConfig("/system/etc/init")
Parser::ParseConfig("/vendor/etc/init")
Parser::ParseConfigFile()
Parser::ParseData()

可以看出rc文件文件主要位于[/]、[/system/etc/init/]、[/vendor/etc/init/]

# tree /
.
+--- init.environ.rc
+--- init.rc
+--- init.recovery.hardware.rc
+--- init.usb.configfs.rc
+--- init.usb.rc
+--- init.zygote32.rc
+--- init.zygote64_32.rc
# tree /system/etc/init/
.
+--- android.hidl.allocator@1.0-service.rc
+--- atrace.rc
+--- atrace_userdebug.rc
+--- audioserver.rc
+--- blank_screen.rc
+--- bootanim.rc
+--- bootstat-debug.rc
+--- bootstat.rc
+--- cameraserver.rc
+--- com.android.car.powertestservice.rc
+--- com.android.car.procfsinspector.rc
+--- drmserver.rc
+--- dumpstate.rc
+--- gatekeeperd.rc
+--- gsi
| +--- init.vndk-.rc
+--- hwservicemanager.rc
+--- incidentd.rc
+--- init-debug.rc
+--- init.gsi.rc
+--- installd.rc
+--- keystore.rc
+--- lmkd.rc
+--- logcatd.rc
+--- logd.rc
+--- logtagd.rc
+--- mdnsd.rc
+--- mediadrmserver.rc
+--- mediaextractor.rc
+--- mediametrics.rc
+--- mediaserver.rc
+--- mtpd.rc
+--- netd.rc
+--- perfetto.rc
+--- perfprofd.rc
+--- racoon.rc
+--- recovery-persist.rc
+--- recovery-refresh.rc
+--- servicemanager.rc
+--- statsd.rc
+--- storaged.rc
+--- surfaceflinger.rc
+--- thermalservice.rc
+--- tombstoned.rc
+--- uncrypt.rc
+--- update_engine.rc
+--- update_verifier.rc
+--- usbd.rc
+--- vdc.rc
+--- vold.rc
+--- vr_hwc.rc
+--- wait_for_keymaster.rc
+--- wifi-events.rc
+--- wificond.rc
# tree /vendor/etc/init/
.
+--- android.automotive.evs.manager@1.0.rc
+--- android.hardware.audio@2.0-service.rc
+--- android.hardware.boot@1.0-service.rc
+--- android.hardware.broadcastradio@intel-service.rc
+--- android.hardware.camera.provider@2.4-external-service.rc
+--- android.hardware.camera.provider@2.4-service.rc
+--- android.hardware.cas@1.0-service.rc
+--- android.hardware.configstore@1.1-service.rc
+--- android.hardware.drm@1.0-service.rc
+--- android.hardware.drm@1.1-service.clearkey.rc
+--- android.hardware.dumpstate@1.0-service.rc
+--- android.hardware.gatekeeper@1.0-service.rc
+--- android.hardware.graphics.allocator@2.0-service.rc
+--- android.hardware.graphics.composer@2.1-service.rc
+--- android.hardware.health@2.0-service.`hardware`.rc
+--- android.hardware.keymaster@3.0-service.rc
+--- android.hardware.light@2.0-service.rc
+--- android.hardware.media.omx@1.0-service.rc
+--- android.hardware.memtrack@1.0-service.rc
+--- android.hardware.power@1.2-service.rc
+--- android.hardware.sensors@1.0-service.rc
+--- android.hardware.thermal@1.1-service.`hardware`.rc
+--- android.hardware.usb@1.0-service.rc
+--- android.hardware.wifi@1.0-service.rc
+--- daemon_cl.rc
+--- hostapd.android.rc
+--- host_server.rc
+--- hw
| +--- init.coredump.rc
| +--- init.crashlogd.rc
| +--- init.dvc_desc.rc
| +--- init.`hardware`.rc
| +--- init.kernel.rc
| +--- init.logs.rc
| +--- init.npk.rc
+--- name_server.rc
+--- rild.rc
+--- SampleDriverAll.rc
+--- vndservicemanager.rc

5.3 事件触发

/*
* am为ActionManager::GetInstance()
* QueueEventTrigger构造了一个EventTrigger对象, 放到事件队列中
* !!!注意此处并没有触发
*/
am.QueueEventTrigger("early-init");
am.QueueEventTrigger("init");
am.QueueEventTrigger("late-init"); /*
* QueueBuiltinAction构造了一个Action对象, 放到事件队列和动作队列中
* !!!注意此处并没有触发
*/
am.QueueBuiltinAction(wait_for_coldboot_done_action, "wait_for_coldboot_done");
am.QueueBuiltinAction(MixHwrngIntoLinuxRngAction, "MixHwrngIntoLinuxRng");
am.QueueBuiltinAction(SetMmapRndBitsAction, "SetMmapRndBits");
am.QueueBuiltinAction(SetKptrRestrictAction, "SetKptrRestrict");
am.QueueBuiltinAction(keychord_init_action, "keychord_init");
am.QueueBuiltinAction(console_init_action, "console_init");
am.QueueBuiltinAction(MixHwrngIntoLinuxRngAction, "MixHwrngIntoLinuxRng");
am.QueueBuiltinAction(queue_property_triggers_action, "queue_property_triggers"); while (true) {
...
if (!(waiting_for_prop || Service::is_exec_service_running())) {
// 依次触发early-init、init、late-init的命令
am.ExecuteOneCommand();
}
...
}

5.4 详细过程

Android启动过程中重要的trigger事件如下

- early-init
+--- start ueventd
- init
- charger /* 当ro.bootmode为charger执行 */
- late-init
+--- early-fs
+--- fs /* 挂载系统分区 */
+--- mount_all /vendor/etc/fstab.${ro.hardware}
+--- post-fs /* 执行依赖文件系统的命令 */
+--- load_system_props
+--- load_properties_from_file("/system/build.prop", NULL);
+--- load_properties_from_file("/odm/build.prop", NULL);
+--- load_properties_from_file("/vendor/build.prop", NULL);
+--- load_properties_from_file("/factory/factory.prop", "ro.*");
+--- load_recovery_id_prop();
+--- start logd
+--- start servicemanager
+--- start hwservicemanager
+--- start vndservicemanager
+--- late-fs
+--- class_start early_hal
+--- post-fs-data /* data分区初始化 */
+--- start vold
+--- installkey /data
+--- bootchart start
+--- init_user0
+--- zygote-start
+--- exec_start update_verifier_nonencrypted
+--- start netd
+--- start zygote
+--- start zygote_secondary
+--- load_persist_props_action
+--- load_persist_props
+--- LoadPersistentProperties()
+--- start logd
+--- start logd-reinit
+--- firmware_mounts_complete
+--- rm /dev/.booting
+--- early-boot
+--- boot +--- property:sys.boot_completed=
+--- bootchart stop

参考:
<Android系统启动流程>
<Android 9.0 init进程分析>
<Android 8.1 启动篇(一) -- 深入研究 init>

Android init介绍(下)的更多相关文章

  1. Android init介绍(上)

    1. 介绍 init进程是Linux系统第一个用户进程,是Android系统应用程序的根进程,即1号进程(PID为1):Android中的init文件位于/init,代码位于system/core/i ...

  2. 下面就介绍下Android NDK的入门学习过程(转)

    为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库 ...

  3. Android Init进程命令的执行和服务的启动

    这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了i ...

  4. Android bluetooth介绍(两): android 蓝牙源架构和uart 至rfcomm过程

    关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本号:基于android4.2先前版本 bluez内核:linux/linux3.08系统:an ...

  5. android Animation介绍

    Animation介绍: 在Android SDK介绍了2种Animation模式: 1. Tween Animation:间动画,通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果,即 ...

  6. Android学习——windows下搭建NDK_r9环境

    1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...

  7. android init进程分析 ueventd

    转自:http://blog.csdn.net/freshui/article/details/2132299 (懒人最近想起我还有csdn好久没打理了,这个Android init躺在我的草稿箱中快 ...

  8. Android monkey介绍

    Android monkey介绍 原文地址 1 简略 monkey是android下自动化测试比较重要的的一个工具,该工具可以运行在host端或者设备(模拟器或真实设备).它会向系统发送随机事件流(即 ...

  9. Android init.rc解析【转】

    转自:http://www.linuxidc.com/Linux/2014-10/108438.htm 本文主要来自$Android_SOURCE/system/init/readme.txt的翻译. ...

随机推荐

  1. 对于之前已经push的项目增加.gitignore配置文件不起作用的处理

    .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 解决方法就是先把本地缓存删除(改变成未track状态),然后再提交 ...

  2. 解决chrome浏览器插件开发者模式每次启动要确认弹出框的问题

    在日常工作中,我们经常会用到一些浏览器插件,有些插件因为没上架到浏览器的应用商店,只能以开发者模式运行,但是chrome浏览器出了限制,每次重新启动浏览器的时候,就会弹出该插件是否要禁止运行的对话框, ...

  3. mysql批量更新数据,循环select记录然后更新某一字段

    -- 处理IEMI重复的历史数据,建档日期(只有年月日)倒序,档案ID倒序,根据IMEI查档案,查询的结果,相同IMEI下的第一条记录的IEMI不处理,其他的记录的imei 改为空. -- USE ` ...

  4. Redis Sentinel分布式集群

    helm部署Redis哨兵分布式集群 Redis Sentinel集群 介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客 ...

  5. Windows下安装gcc环境

    安装GCC环境 https://gcc.gnu.org/ 点进去后 然后 然后 点击 再点击 点击 (啊,这是跳了多少个页面) 开始下载了.完成之后打开:(自动执行的) 弹出 点击OK,弹出个窗口,让 ...

  6. javascript中 for in 、for 、forEach 、for of 、Object.keys().

    一 .for ..in 循环 使用for..in循环时,返回的是所有能够通过对象访问的.可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例.这里需要注意的是使用for-in返回的属性因各 ...

  7. Resharper速度慢解决办法

    Reshaper很好用,但是安装后速度特别慢,大部分情况下,我们只需要使用一些插件功能,代码自动分析功能可以关闭,如图:取消Code analysis即可.

  8. Node.js 开发指南-读书笔记

    1. Node.js 使用了单 线程.非阻塞的事件编程模式 Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计.对于高并发的解决方 案,传统的架构是多线程模型,也就是为每个业务逻辑 ...

  9. 【rt-thread】1、快速建立rt-thread nano最小裁剪工程

    快速建立rt-thread nano最小裁剪工程 使用keil5建立 1.下载rt-thread 3.03版本,3.03程序占用最小 2.使用 CubeMX 配置工程 3.选择添加rt-thread ...

  10. Git diff (---和+++具体解释)(转)

    转自:https://blog.csdn.net/lovezbs/article/details/46492933