Android核心服务解析篇(一)——Android系统的启动

作者:杭州车成汽车事务代理服务部 来源:www.guohuicar.com 发布时间:2017-09-08 20:18:24
Android核心服务解析篇(一)——Android系统的启动

从大的方面来说,Android系统的启动可以分为两个部分:第一部分是Linux核心的启动,第二部分是Android系统的启动。第一部分主要包括系统引导,核心和驱动程序等,由于它们不属于本篇要讲的内容,这里就不再讨论。在本篇博客中,我们重点讲解Android系统的启动,这一过程主要经过两个阶段,分别是应用的初始化流程与system_service进程及核心服务的创建流程。

1.初始化流程

初始化流程,顾名思义,它完成Android的一些初始化工作,包括设置必要的环境变量,启动必要的服务进程,挂载必要的设备等,而这些工作将会为整个Android打下坚实的基础。

①应用的初始化流程

在核心启动完成以后,将进入Android文件系统及应用的初始化流程,此时将会转向执行init.c中的main()函数(路径:/system/core/init/init.c),该函数的执行流程如下图所示:

\

\

下面我们了解一下上图中的注解

注解1:/dev表示设备文件系统或者udev挂载点,/proc用来挂载存放系统过程性信息的虚拟文件系统,/sys用于挂载“sysfs文件系统”。由于前面调用了umask(0),因此mkdir(“/dev”,0755)得到的权限应该是0755.

注解2:init.rc的解析结果是形成action_list(on关键字相关的部分),service_list(service_关键字相关的部分)以及action_queue(需要执行的命令或服务),以便后续流程使用。

注解3:解析/proc/cmdline文件,将其中的属性导入Android系统全局变量。

注解4:

Ⅰget_hardware_name()方法用于解析/proc/cpuinfo文件获取硬件信息,并用于拼接成一个init..rc文件,继续解析。

Ⅱ在解析init.rc文件的过程中,系统会根据该文件的内容形成一些需要命令,动作或者触发器的列表并将这些存入在内在中,以便在必要的时候使用。不同的厂商可能根据不同的硬件需求定制不同的.rc文件,这些.rc文件的名称一般为“init..rc”,而解析这些.rc文件的结果同样也会形成一些命令,动作或者触发器的列表,而这些列表将会合并解析init.rc所得的命令和动作的列表中,并且形成最终需要执行的命令和动作。

注解5:添加顺序为:early-init下的所有动作,wait_for_coldboot_done_action,property_init_action,keychord_init_action,console_init_action,set_init_properties_action,init下的动作,property_service_init_action,signal_init_action,check_startup_action,early-boot下的所有动作,boot下的所有动作,queue_property_triggers_action。这些动作组成了开机过程中看到的设备的状态,比如开机动画等。

注解6:这里会启动执行设置属性,创建或挂载动作以及启动服务等操作。需要注意是的这里启动的服务包括最重要的servicemanager和zygote服务进程。

至此,init进程进入死循环中处理一些消息以等待命令的到来。在这个过程中,我们将要了解以下知识。

Ⅰ在init运行的过程中产生了许多服务,它们是整个Android的基础,分别是ueventd,console,adbd,servicemanager,vold,netd,debuggerd,ril-daemon,surfaceflinger,zygote,drm,media,bootanim,dbus,bluetoothd,installd,flash_recovery,racoon,mtpd,keystore和dumstate。

Ⅱ整个init的行为甚至整个Android核心的属性都受到启动脚本init.rc的影响。

下面我们就重点介绍zygote的启动行为,详细了解init.rc的语法。

②init.rc的用法

Android初始化语言由声明的4个类型组成,它们分别是动作(action),命令(command),服务(service),和选项(option),以#开头的行表示注释。动作和服务声明新的一节并且有唯一的名字,所有的命令或者选项属于最近声明的节。如果下一个动作或者服务的名字已存在(也就是重名),则它将作为错误被忽略。

Ⅰ动作

动作是命令序列,它有一个触发器,用于确定行动应在何时发生。当发生某一个事件时,它可以匹配到一个动作触发器,并且该动作会被添加到要执行队列的尾部(除非它已经在队列中了)。

队列中的每个动作是按顺序出列的,具体如下所示:

on early-init

write /proc/1/oom-adj -16

setcon u:r:init:s0

start ueventd

动作表现为以下的形式:

on







.........

触发器是一些字符串,这些字符串可用于匹配一定类型的事件,并且用于触发动作。下表罗列了一些触发器的定义。

触发器 说明

boot 当初始化流程触发的时候,boot是首先被触发的动作(在完成/init.conf文件加载之后)

= 当以命名的属性被设为特定的值时,该触发器发生

device-added- 当添加设备节点时,device-added-定义的触发器运行

device-removed- 当移除设备节点时,device-removed-定义的触发器运行

service-exited- 当指定的服务退出时,service-exited-类型的触发器运行

自定义的触发器,可由init代码负责管理


Ⅱ命令

命令是组成动作的成员,也就是说,动作由一个个命令组成。下表罗列了动作支持的命令。

命令 说明

exec []* fork并执行程序()。这在程序完成执行之前将阻塞一切进程,因此最好避免使用exec命令。该命令中两个参数的含义如下所示。
?:可执行文件的路径
?[]*:可执行文件所需的参数,参数个数可以是0或者多个

export 设置名字为的环境变量为

ifup 打开网络接口

import 解析一个初始化配置文件,导入系统中

hostname 设置主机名

chdir 修改工作目录,它的功能和cd命令一样

chmod 修改文件的访问权限

chown 修改指定的问题的所有者和组

chroot 修改进程根目录为

class_start 启动类别的服务,如果它们没有运行的话

class_stio 停止类别的服务,如果它们已经处于运行状态的话

domainname 设置域名

insmod 在上安装模块

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:孝感网站建设 http://xiaogan.45qun.com

  • 上一篇:模板修改实例 看图说话包你会
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 杭州车成汽车事务代理服务部 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100