AndroidL系统启动及加载流程分析 下载本文

Android L系统启动及加载流程分析

1、概述

Android L的启动可以分为几个步骤:Linux内核启动、init进程启动、native系统服务及java系统服务启动、Home启动,主要过程如下图:

服务管理器,负责native和java服务的注册、查询显示相关初始化、控制开关机动画bootanimServiceManger进程SurfaceFlinger进程启动native服务MediaServer进程Linux内核Init进程AudioFingerMediaPlayerService服务注册AudioPolicyService...AndroidRuntimeZygote进程registerZygoteSocketPreloadAndroidL会启动两个ZygoteSystemServer进程启动java服务PowerManagerServiceActivityManagerServicePackageManagerServiceWindowManagerService...Home启动 图1

整个启动流程跟4.4及之前的版本相差不多,只是有个别不同之处,本文我们主要分析Linux内核启动之后的过程。

2、启动过程分析

2.1 init进程启动

当系统内核加载完成之后,会启动init守护进程,它是内核启动的第一个用户级进程,是Android的一个进程,进程号为1,init进程启动后执行入口函数main(),主要操作为:

Main()创建挂载目录(dev\\sys\\proc等)处理kernel cmdline获取开机原因等Selinux初始化,加载策略文件顺序解析rc文件执行rc文件中的动作for循环不退出,作为property服务进程存在 图2

AndroidL上将selinux的安全等级提高了,设为了enforcing模式,4.4上是permissive模式。

解析rc脚本文件,即init.rc脚本,该文件是Android初始化脚本,定义了一系列的动作和执行这些动作的时间阶段earyl-init、init、early-boot、boot、post-fs等阶段。init 进程main函数中会根据这些阶段进行解析执行。AndroidL上为了流程更清晰,增加了charger(充电开机)、ffbm(工厂模式)、以及late-init阶段,实际上这些阶段是对其他阶段的组合执行,比如late-init:

2.2 ServiceManager的启动

servicemanager的启动就是init进程通过init.rc脚本启动的:

源码在frameworks/native/cmds/servicemanager/service_manager.c中,servicemanager是服务管理器,它本身也是一个服务(handle=0),通过binder调用,为native和Java系统服务提供注册和查询服务的,即某个服务启动后,需要将自己注册到servicemanager中,供其他服务或者应用查询使用。AndroidL上servicemanger中在处理注册和查询动作之前添加了selinux安全检测相关的处理。

2.3 SurfaceFinger、MediaServer进程启动

Android4.4以前,surfacefinger的启动根据属性system_init.startsurfaceflinger,决定是通过init.rc启动还是systemserver进程启动,之后的版本包括AndoridL都是通过init.rc启动的:

启动后会向servicemanager进程注册服务中,该服务启动时主要功能是初始化整个显