上一篇: <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. [Mobi] cordova requirements,Exception in thread "main" java.lang.NoClassDefFoundError

    Cordova App Preparation https://quasar.dev/quasar-cli/developing-cordova-apps/preparation $ cordova ...

  2. 湖南省第6届程序大赛第6题 Biggest Number

    Problem F Biggest Number You have a maze with obstacles and non-zero digits in it: You can start fro ...

  3. 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式

    1. 通过Executors创建线程池的弊端 在创建线程池的时候,大部分人还是会选择使用Executors去创建. 下面是创建定长线程池(FixedThreadPool)的一个例子,严格来说,当使用如 ...

  4. IntelliJ IDEA 删除自定义的 Maven 框架依赖

    IntelliJ IDEA 删除自定义的 Maven 框架依赖 IntelliJ Idea中添加Maven Archetype,但是IntelliJ Idea中并没有提供删除的方法. windows中 ...

  5. Word 频繁无响应

    可以参考以下方法,这是我的解决办法,不保证对你也有用. 步骤一: 在「开始 > 运行」中输入「winword /a」进入无加载项 Word: 依次进入「Word 选项 > 高级 > ...

  6. 【Linux】Ubuntu修改root用户密码

    使用vmware安装ubuntu的时候,安装完之后发现没有root用户密码,只有新建用户,这个时候需要重新设置root用户密码 在新建用户下面运行 sudo passwd root

  7. 阿里云主机centos7系统创建SWAP区,并启动挂载(适合无SWAP区虚拟化平台)

    以root用户登录建立交换区文件: fallocate -l 2G /swapfile /swapfile //赋予仅root用户的权限,确保安全 mkswap /swapfile swapon /s ...

  8. ELK学习笔记之logstash的各个场景应用(配置文件均已实践过)

    详细请参考该文 https://www.cnblogs.com/qingqing74647464/p/9378385.html

  9. 使用 ProcessMonitor 找到进程所操作的文件的路径

    原文:使用 ProcessMonitor 找到进程所操作的文件的路径 很多系统问题都是可以修的,不需要重装系统,但是最近我还是重装了.发现之前正在玩的一款游戏的存档没有了--因为我原有系统的数据并没有 ...

  10. 2019 华云数据java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.华云数据等公司offer,岗位是Java后端开发,最终选择去了华云数据. 面试了很多家公司,感觉大部分公司考察的点 ...