前言
Android 开发工程师,进程被问,系统启动流程的问题,不需要记住每个环节,只需要只要其大致原理即可。
大致流程图
Android平台架构
在Android平台架构中,google给出了Android平台结构
- Linux 内核
- 硬件抽象层 (HAL)
- Android Runtime
- 原生 C/C++ 库
- Java API 框架
- 系统应用
在百度百科中 Android系统构架,从低到高分别是
- Linux内核层
- 系统运行层
- 应用框架层
- 应用层
电源启动&&系统启动
当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。
引导程序(Boot Loader)是在Android操作系统开始运行前的一个小程序,它的主要作用是把Linux内核拉起来并运行。
Linux内核启动
idle进程
当linux内核启动以后,他会通过静态方式创建第一个进程 idle进程 也要做swapper进程,进程号(pid) 为 0 ,他是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程
init进程
idle进程 通过 kernel_thread创建出 init进程,pid=1,而他是系统中所有其它用户进程的父进程,换而言还,所有的用户进程都是通过 init进程 fork 出来的
kthreadd进程
idle进程 通过 kernel_thread创建出 kthreadd进程,pid=2,他负责所有内核线程的调度和管理
init进程启动
init进程 从 idle进程 被fork 出来以后,主要做了一下几件事情
- 创建和挂载启动所需的文件目录
- 初始化和启动属性服务。Windows平台上有一个注册表管理器,注册表的内容采用键值对的形式来记录用户、软件等使用信息。如果系统或软件重启,还是能够根据这份注册表中的记录,进行相应的初识化工作。Android也提供了一个这样类型的机制,即属性服务。
- 解析init.rc配置文件,并且启动了Zygote进程
在最新的Android11 源码中,程序的入口 不再试之前的 init.cpp 而是 system/core/init/main.cpp
Zygote进程
Zygote进程 是从 init进程被fork 的。他是Android系统第一个Java进程(虚拟机进程),也是所有Java进程的父进程。
1.创建AppRuntime并调用其start方法,启动Zygote进程
2.创建DVM并为DVM注册JNI.
3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
4.通过registerZygoteSocket函数创建服务端Socket,并通过runSelectLoop函数等待ActivityManagerService的请求来创建新的应用程序进程。
5.启动SystemServer进程
SystemServer进程
1.启动Binder线程池,这样就可以与其他进程进行通信。
2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。
3.启动各种系统服务。如ActivityManagerService(负责四大组件的启动、切换、调度),WindowManagerService(窗口管理服务)等等
4.ActivityManagerService 启动Launcher(Home应用程序)
Launcher启动
Launcher是Android系统的一个 Home应用程序,这个应用程序用来显示系统中已经安装的应用程序。应用程序Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序