问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android系统启动流程详解

创作时间:
作者:
@小白创作中心

Android系统启动流程详解

引用
CSDN
1.
https://m.blog.csdn.net/qq_42886163/article/details/140812612

在Android开发领域,系统启动性能的优劣直接关系到用户体验。本文将深入剖析Android系统启动过程中各个进程的启动顺序和职责,帮助开发者更好地理解系统启动机制。

一、Android系统启动概述

当电源键被按下时,芯片将从固化在ROM中的代码开始运行,直到启动整个系统。具体流程如下:按下电源→引导程序Bootloader→加载Linux内核(寻找init进程代码)→执行init进程→启动Zygote进程→启动SystemServer进程→启动launcher进程。以下是详细的流程图:

二、从Android系统架构(进程视角)看启动

3.1 Loader层

  • Boot ROM:当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在ROM里的预设代码开始执行,然后加载引导程序到RAM。
  • Boot Loader:这是启动Android系统之前的引导程序,主要负责检查RAM,初始化硬件参数等功能。

3.2 Linux内核层

Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。

  • 启动Kernel的swapper进程(pid=0):该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作。
  • 启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。kthreadd进程是所有内核进程的鼻祖。

3.3 硬件抽象层 (HAL)

硬件抽象层 (HAL) 提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。

3.4 Android Runtime & 系统库

每个应用都在其自己的进程中运行,都有自己的虚拟机实例。ART通过执行DEX文件可在设备运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,经过优化,使用内存很少。ART主要功能包括:预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC),以及调试相关的支持。

这里的Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进程的鼻祖。

  • init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;
  • init进程还启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务
  • init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程),Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来的。

3.5 Framework层

  • Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:
  • 加载ZygoteInit类,注册Zygote Socket服务端套接字
  • 加载虚拟机
  • 提前加载类preloadClasses
  • 提前加载资源preloadResouces
  • System Server进程,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务。
  • Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。

3.5 App层

  • Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;
  • Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。
  • 所有的App进程都是由Zygote进程fork生成的。

序号 进程启动 概述
1 init进程 Android 启动过程中的第一个用户空间进程, Init.main
2 Zygote进程 Java层的第一个进程 所有App进程的父进程, ZygoteInit.main
3 system_server进程 系统各大服务的载体进程
4 servicemanager进程 binder服务的大管家, 守护进程循环运行在binder_loop
5 app进程 通过Process.start启动App进程, ActivityThread.main

四、各进程间的通信方式

  1. Binder:Binder是Android系统提供的一种IPC机制
  2. Socket:Socket是Linux原有的进程间通信方式,C/S架构,比Binder简单很多。在Android系统中采用Socket通信方式的主要有:
  • zygote:用于孵化进程,system_server创建进程是通过socket向zygote进程发起请求;
  • installd:用于安装App的守护进程,上层PackageManagerService很多实现最终都是交给它来完成;
  • lmkd:lowmemorykiller的守护进程,Java层的LowMemoryKiller最终都是由lmkd来完成;
  • adbd:这个也不用说,用于服务adb;
  • logcatd:这个不用说,用于服务logcat;
  • vold:即volume Daemon,是存储类的守护进程,用于负责如USB、Sdcard等存储设备的事件处理。

简单来说由init进程派生出来的进程基本都是使用Socket进行进程间通信

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号