Android init介绍(下)

上一篇请参考<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>

上面的命令将导入/init.environ.rc然后被解析为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=1

/*
 * 多个条件用&&连接
 * -- 表示当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()

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();
    }
    ...
}

参考:
<Android系统启动流程>
<Android 9.0 init进程分析>
<Android 8.1 启动篇(一) -- 深入研究 init>
<https://zhuanlan.zhihu.com/p/83123906>

原文地址:https://www.cnblogs.com/hzl6255/p/12070969.html

时间: 2024-10-14 01:16:33

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

Android binder介绍(下)

上一篇: <Android binder介绍(上)> 5. Java Binder ServiceManagerProxy  ServiceManagerNative http://gityuan.com/android/ https://www.jianshu.com/p/34ca9bf45d0b 原文地址:https://www.cnblogs.com/hzl6255/p/12117227.html

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

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的. 3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用. 下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的. 一

Android jni aes加解密,实现文件的加解密,具体实现可以自行修改,上面的代码为简单介绍,下面的是JNI端实现文件加解密,可以修改为字符串加解密

#include "aes.h" #include "modes.h" #include "e_os2.h" #include "aes_locl.h" #include "opensslconf.h" AES_KEY aes; //aes cbc模式加解密用到的向量 unsigned char iv[AES_BLOCK_SIZE]; for (i = 0; i < AES_BLOCK_SIZE; i

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者,请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!!一.Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些

Android中自定义下拉样式Spinner

Android中自定义下拉样式Spinner 本文继续介绍android自定义控件系列,自定义Spinner控件的使用. 实现思路 1.定义下拉控件布局(ListView及子控件布局) 2.自定义SpinerPopWindow类 3.定义填充数据的Adapter 效果图 一.定义控件布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:/

Android init源代码分析(2)init.rc解析

本文描述init.rc脚本解析以及执行过程,读完本章后,读者应能 (1) 了解init.rc解析过程 (2) 定制init.rc init.rc介绍 init.rc是一个文本文件,可认为它是Android系统启动脚本.init.rc文件中定义了环境变量配置.系统进程启动,分区挂载,属性配置等诸多内容.init.rc具有特殊的语法.init源码目录下的readme.txt中详细的描述了init启动脚本的语法规则,是试图定制init.rc的开发者的必读资料. Android启动脚本包括一组文件,包括

Android -- Init进程对信号的处理流程

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

Android init源代码分析(1)概要分析

功能概述 init进程是Android内核启动的第一个进程,其进程号(pid)为1,是Android系统所有进程的祖先,因此它肩负着系统启动的重要责任.Android的init源代码位于system/core/init/目录下,伴随Android系统多个版本的迭代,init源代码也几经重构. 目前Android4.4源代码中,init目录编译后生成如下Android系统的三个文件,分别是 /init /sbin/ueventd-->/init /sbin/watchdogd-->/init 其

android init进程分析 基本流程

(懒人最近想起我还有csdn好久没打理了,这个android init躺在我的草稿箱中快5年了,稍微改改发出来吧) android设备上电,引导程序引导进入boot(通常是uboot),加载initramfs.kernel镜像,启动kernel后,进入用户态程序.第一个用户空间程序是init, PID固定是1.在android系统上,init的代码位于/system/core/init下,基本功能有: 管理设备 解析并处理启动脚本init.rc 实时维护这个init.rc中的服务 init进程的