Android的启动流程作为整个Android系统的开端,这部分的流程时刻影响着应用层的方方面面。这些知识也是作为Android开发进阶必须要了解的一部分。
因此,本文通过流程图来探索一下Android的启动过程。
- Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。(这一步由“芯片厂商”负责设计和实现)
- Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。(这一步由“设备厂商”负责设计和实现)
- Linux内核开始启动,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程--init程序。
- init进程启动:初始化和启动属性服务,并且启动Zygote进程
init程序最核心的工作主要有3点:
- 创建和挂载一些系统目录/设备节点,设置权限,如:/dev, /proc, and /sys
- 解析 init.rc 和 init.<hardware>.rc,并启动属性服务,以及一系列的服务和进程。
- 显示boot logo,默认是“Android”字样
- Zygote进程启动:创建java虚拟机并为java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。
- SystemServer进程启动: 启动Binder线程池和SystemServiceManager,并且启动各种系统服务。
- Launcher启动:被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。
init进程
init进程是Android系统中用户控件的第一个进程,进程号是1。
- 创建和挂载启动所需的文件目录:
这是init进程启动开始的第一步,其中挂载了tmpfs、devpts、proc、sysfs和selinuxfs共5种文件系统,这些都是系统运行时目录,顾名思义,只在系统运行时才会存在,系统停止时会消失。 - 初始化和启动属性服务
- 解析init.rc配置文件并启动Zygote进程
Zygote
1.创建了一个Server端的Socket
2.预加载类和资源
3.启动了SystemServer进程
4.等待AMS请求创建新的应用程序进程
SystemServer
1.启动Binder线程池
2.创建了SystemServiceManager(用于对系统服务进行创建、启动和生命周期管理)
3.启动了各种服务
服务
服务包含2部分,一部分是本地服务,另一部分是Android服务,所有的这些服务都会向ServiceManager进程注册,由它统一管理,这些服务的启动过程介绍如下:
本地服务
本地服务是指运行在C++层的系统守护进程,一部分本地服务是init进程直接启动的,它们定义在init.rc脚本和init.<hardware>.rc中,如 ueventd、servicemanager、debuggerd、rild、mediaserver等。还有一部分本地服务,是由这些本地服务进一步创建的,如mediaserver服务会启动AudioFlinger, MediaPlayerService 等本地服务。
Android服务
Android服务是指运行在Dalvik虚拟机进程中的服务,这些服务的创建过程描述如下:
init进程会执行app_process程序,创建Zygote进程,它是Android系统最重要的进程,所有后续的Android应用程序都是由它fork出来的。
Zygote进程会首先fork出"SystemServer"进程,"SystemServer"进程的全部任务就是将所有的Android核心服务启动起来,这些服务包括:
当所有的服务都启动完毕后,SystemServer会打印出“Making services ready”,然后通过ActivityManager启动Home界面,并发送“ACTION_BOOT_COMPLETED”广播消息。
注意,这些Android服务并没有各种运行在独立的进程中,它们由SystemServer以线程的方式创建,所以都运行在同一个进程中,即SystemServer进程中。
参考链接:
https://blog.51cto.com/ticktick/1659473
//www.greatytc.com/p/2c1318b0f527
https://blog.csdn.net/shaoenxiao/article/details/87088982