Android启动流程

Android启动流程

从上电开始到系统服务启动完成。整个流程的可以简述为:BootLoader -> Kernel -> Native-> Framework-> App

上电

引导芯片从固化在ROM里预设的代码开始执行。它将引导加载程序加载到RAM中并开始执行。

Bootloader

Bootloader的主要作用是准备硬件环境,引导Linux Kernel(Linux内核)的启动。
启动过程中,会区分本次要启动的系统是Android系统或Recovery模式还是Fastboot模式,完成引导加载程序后,它将执行跳转到Linux内核。

Kernel

Android系统底层基于Linux Kernel, Linux内核在Android上启动的方式与在其他系统上类似。在kernel进入c语言阶段后,会开始执行start_kernel函数,它将设置系统运行所需的一切:初始化中断控制器,设置内存保护,缓存和调度等。最后调用rest_init函数启动三个进程(idle、init、kthreadd),来开启操作系统的正式运行。

  • swapper(idle)进程(pid=0),这是系统初始化过程kernel创建的第一个进程,也是唯一一个没有通过fork产生的进程,运行在内核态。用于初始化进程管理、内存管理、加载Display、Camera、Binder等驱动,以及启动init进程(pid=1)kthreadd进程(pid=2)
  • init进程,是用户空间的第一个进程,也是用户进程的鼻祖。init进程由idle通过kernel_thread创建,在内和空间完成初始化后,加载init程序,并最终转变为用户空间的init进程,完成系统的初始化。在系统启动完成后,init将演变为守护进程监视系统的其他进程。
  • kthreadd进程,这是Linux系统的内核进程,是所有内核进程的鼻祖。kthreadd进程由idle通过kernel_thread创建,并始终运行在内核空间,负责所有内核线程的调度和管理。它的任务就是管理和调度其他内核线程kernel_thread,它会循环执行一个kthreadd的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread,我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接地以kthreadd为父进程。一旦内存管理单元和缓存被初始化,系统将能够使用虚拟内存并启动用户空间进程。 内核将在根文件系统中查找init进程入口(在Android目录的system/core/hw/init下找到),并将其作为初始用户空间进程启动。

这层真正的大主管是kthreadd进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护线程。

Native

进入用户空间。

  • 这层init进程是大主管。它负责孵化各种系统级服务、守护进程等。最重要的是孵化出Zygote进程。
  • Media Server进程:负责启动和管理整个C++ framework,包含AudioFlinger、Camera Service等服务。

Framework

在Native之上,也是用户空间,主要给app层提供api以及系统服务。

  • 这层大主管是Zygote进程。它负责注册Zygote Socket服务端套接字,加载虚拟机,preloadClasses和preloadResouces。
  • System Server进程:负责启动和管理整个Java framework,包含AMS、PMS、WMS等服务。

APP

所有的App进程都是由Zygote进程fork生成的。


Android启动流程
https://citrus-maxima.github.io/2024/03/09/Android启动流程/
作者
柚子树
发布于
2024年3月9日
许可协议