Android 系统启动流程 浅析

前言

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 出来以后,主要做了一下几件事情

  1. 创建和挂载启动所需的文件目录
  2. 初始化和启动属性服务。Windows平台上有一个注册表管理器,注册表的内容采用键值对的形式来记录用户、软件等使用信息。如果系统或软件重启,还是能够根据这份注册表中的记录,进行相应的初识化工作。Android也提供了一个这样类型的机制,即属性服务。
  3. 解析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返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序

参考