Android系统启动的过程
关于Android系统启动的过程,以前一直觉得离自己很遥远。随着不断深入的学习,是时候要了解一下。这里就综合网上的很多资料来分析一下Android系统启动的过程。
图示
首先贴上两张图,展示Android系统启动的过程。
图一:
图二:
通过以上两张图,我们能清晰地了解Android系统启动的过程。
下面就开始切入正题。
Android系统启动的过程
第一阶段:Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。(这一步由“芯片厂商”负责设计和实现)
第二阶段:Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。(这一步由“设备厂商”负责设计和实现)
第三阶段:Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统。
第四阶段:执行init程序,由此开启Android的世界。(这一步则是Android内核开发过程中需要涉及的地方)
Android系统以及各大Linux的发行版,他们的Linux内核部分启动过程都是差不多的,他们之间最大的区别就在于init程序的不同,因为init程序决定了系统在启动过程中,究竟会启动哪些守护进程和服务,以及呈现出怎样的一个用户UI界面。
因此,init程序是分析Android启动过程中最核心的程序。
init
启动过程是代码system\core\init\init.cpp的 main 函数的执行过程。在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket 监听等。在rc文件解析中会启动 ServiceManager 服务和 Zygote 进程。
init程序最核心的工作主要有3点:
创建和挂载一些系统目录/设备节点,设置权限,如:/dev, /proc, and /sys
解析 init.rc 和 init.< hardware >.rc,并启动属性服务,以及一系列的服务和进程。
启动Launcher主界面,将已经安装的app程序的快捷图标展示到桌面
ServiceManager
ServiceManager 用来管理系统中所有的 binder service,不管是c++实现的本地服务还是Java语言实现的Android服务都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的 Service 使用前都必须先在 ServiceManager 中进行注册。
本地服务是指运行在C++层的系统守护进程,而Android服务是指运行在Dalvik虚拟机进程中的服务。
Zygote
Zygote进程启动才算建立起真正的 Android 的运行空间。不过 Init 进程不会直接启动 Zygote 进程,而是使用 app_process 命令来通过 Android Runtime 来启动,Android Runtime 会启动第一个 Davlik 虚拟机,并调用 Zygote 的 main 方法,启动服务。
Zygote Android系统最重要的进程,所有后续的Android应用程序都是由它fork出来的。
Zygote进程会首先fork出SystemServer进程,SystemServer进程的全部任务就是将所有的Android核心服务启动起来。而这些Android服务并没有各种运行在独立的进程中,它们由SystemServer以线程的方式创建,所以都运行在同一个进程中,即SystemServer进程中。
启动Launcher
当所有的服务都启动完毕后,SystemServer会打印出“Making services ready”,然后通过ActivityManager启动Launcher主界面,并发送“ACTION_BOOT_COMPLETED”广播消息。
如果用户点击app的图标,就和ActivityManager开始通信,然后ActivityManager向Zygote发送消息。Zygote意为受精卵,这个时候Zygote就分裂了,fork出一个新的进程,就是我们要启动的应用。
至此Android系统启动的过程和重点大致分析完了。
如果想进一步研究可以参考源码和我下边列出的文章。
参考:
1.Android内核开发:图解Android系统的启动过程
2.Android 系统启动流程
3.【Android 系统开发】 Android 系统启动流程简介
4.Android系统启动过程