当前位置:首页 > android系统开机启动流程分析
一, 系统引导bootloader
加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内
核。还有ramdisk】 二, 内核kernel
bootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成
启动。
内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init
process,切换至用户空间(user-space)
内核zImage解压缩
head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包
裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境 (内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init会调用kernel_init启动init进程(缺省是/init)。然后执行schedule开始任务调度。这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。
三, Init进程启动
【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】 init进程启动后,根据init.rc 和init.
service.list中【system/core/init/init_parser.c】。
建立service进程。【service_start(…) execve(…)】 在init.c中,完成以下工作
1、
初始化log系统【解析/init.rc和init.%hardware%.rc文件,在两个文件解析步骤2时执行“early-init”行动】
2、 3、
初始化设备【在/dev下创建所有设备节点,下载firmwares】 初始化属性服务器【在两个文件解析步骤2时执行“init”行动】
4、 开启属性服务【在两个文件解析步骤2时执行“early-boot”和“boot”行动;在两个文件解析步骤2时执行“excecute property”行动】
5、 进入一个无限循环【等待device/property set/child进程退出事件】
四, Servicemanager
【Servicemanager属于Native Service。在执行init.rc时就会启动,与Zygote一样】
通知binder设备,把自己变成context_manager
【service servicemanager/system/bin/servicemanager,从main(…)开始】 进入循环,不停的去读binder设备,看是否有对service的请求
如果有,调用svcmar_handler函数回调处理请求
【在Servicemanager中的svcmar_handler负责处理android中所有有
关service的请求响应】
有增加服务请求时,由Servicemanager负责注册各项服务。【注册后,
会将该service加入svcList中,svcList中存了各个注册过的service的name和handler。当接收到获取service的请求时,Servicemanager会去查找该service,如果存在,则把返回数据写入reply,返回给客户。】 【处理服务注册和监听】
五, Zygote
【Servicemanager和Zygote进程奠定了android的基础,Zygote这个进程起来才会立起真正的android运行空间,初始化建立的service都是Native service.rc在脚本文件中Zygote的描述,Zygote是用于初始化虚拟机的进程,它会监听请求创建虚拟机实例的socket】 建立java runtime【Zygote从main(…)开始 frameworks/base/cmds/app_main.cpp】 创建Dalvik java虚拟机,JNI_Createjava VM() 注册Android Runtime中的JNI接口给虚拟机
呼叫Java类com.android.internal.os.ZygoteInit中的main函数【AndroidRuntime::start(…)
frameworks/base/core/jni/AndroidRuntime.cpp】 登记Listen端口,用来接受请求【registerZygoteSocket()】
加载preloaded class、resource用来加快启动速度,【preloadClasses()】 启动System Server【startSystemServer()】
进入Zygote服务框架,经过以上步骤Zygote就建立完成,利用socket通信,接受ActivityManagerService的请求,fork应用程序。
六, System server
【System Server作为Zygote的第1个子进程,是Android Framework的核心,它主要负责Android系统初始化并启动其他服务。其它的Android服务都由SystemServer启动并运行在该进程空间】 Fork出独立的进程,名称为“system-server”
System service启动原生服务,包括Surface Flinger和Audio Flinger
【system_main.cpp的main函数调用system_init.cpp的system_init函数。然后调用SystemServer.java的SystemServer:Init2,启动新线程】 原生system service向service manager注册为IPC服务目标。【比如AudioFlinger.cpp的instantiate函数】
System service开始Android managed services。 Android managed services向service manager注册 System server加载所有的服务后,系统初始化完成
七, Home启动
使用xxx.systemReady()通知各个服务,系统已经就绪。 特别对于ActivityManagerService.systemReady(回馈)
Widget.wallpaper.imm(输入法)等ready通知
启动Launcher
共分享92篇相关文档