Android操作系统架构
Android操作系统架构
前言
根据Google官方提供的经典分层架构图,从下往上一次分为Linux内核、HAL、系统Native库和Android运行时环境、Java框架层以及应用层这5层架构
我们看到的是各个静态分层的架构划分,我们通过进程以及线程间通信使代码跑起来,让程序活起来。
系统架构
系统启动架构图
图解:Android系统启动过程由上图从下往上的一个过程是由BootLoader引导开机,然后一次进入 > Kernel > Native > Framework > APP。
Android启动过程的初始阶段
Android设备的启动过程始于两个关键阶段:Boot ROM和Boot Loader。这两个阶段为操作系统的加载奠定了基础。
Boot ROM
当用户长按电源键启动设备时,首先被激活的是Boot ROM。这是一个存储在只读存储器(ROM)中的小程序,它是设备启动链中的第一环。Boot ROM的主要职责包括:
- 执行固化在ROM中的预设代码
- 初始化系统内存和关键硬件组件
- 加载Boot Loader到随机存取存储器(RAM)中
Boot Loader
Boot Loader是Android系统启动前的关键引导程序,它在Boot ROM之后接管控制权。其主要功能包括:
- 进行更全面的硬件检测和初始化
- 建立内存空间映射并进行内存管理
- 为加载操作系统内核做准备
Boot Loader的存在确保了设备硬件得到正确初始化,为Android操作系统的加载创造了必要的环境条件。这两个阶段共同构成了Android设备启动过程的基础,为后续操作系统的加载和运行铺平了道路。
Linux内核层
Android系统的基石:Linux内核
Android平台的核心基础是Linux内核,它为整个系统提供了关键的底层功能和安全机制。例如,Android运行时(ART)虚拟机在执行应用程序时,最终会调用Linux内核提供的系统服务来完成底层操作。Linux内核为Android带来了多方面的优势:
- 强大的安全机制: Linux内核的安全特性为Android系统提供了坚实的保护,包括进程隔离、权限控制和内存保护等。
- 硬件适配性: 内核允许设备制造商开发专门的硬件驱动程序,这大大增强了Android的硬件兼容性和可扩展性。
关键进程的初始化
在Android系统启动过程中,Linux内核会初始化两个至关重要的进程:
- swapper进程 (PID 0):也被称为idle进程是内核初始化过程中创建的第一个进程负责进程管理和内存管理的初始化加载显示驱动、相机驱动、Binder驱动等核心组件
- kthreadd进程 (PID 2):Linux系统的核心内核进程负责创建其他内核线程,如:kworker:处理工作队列ksoftirqd:处理软中断thermal:管理热量相关的任务被视为所有内核进程的”祖先”
这两个进程的初始化标志着Android系统底层核心组件的成功启动,为上层应用和服务的运行奠定了基础。通过这种方式,Linux内核不仅为Android提供了稳定可靠的运行环境,还确保了系统的高效性和安全性。
硬件抽象层 (HAL)
硬件抽象层(Hardware Abstraction Layer, HAL)是Android系统架构中的一个关键组件,它在操作系统内核与硬件之间提供了一个抽象接口层。HAL的主要作用和特点如下:
- 抽象硬件接口:
HAL为各种硬件组件(如摄像头、音频、显示等)提供标准化的接口,屏蔽了底层硬件的具体实现细节 - 位置:
HAL位于Linux内核之上,Android框架之下,是连接硬件驱动和高层Android系统的桥梁 - 实现方式:
HAL模块通常以共享库(.so文件)的形式实现,放置在/vendor/lib或/system/lib目录下 - 加载机制:
当Android框架需要访问某个硬件时,系统会动态加载对应的HAL模块 - 标准化接口:
Google定义了一系列HAL接口规范,硬件厂商需要按照这些规范来实现具体的HAL模块 - 保护厂商利益:
HAL允许硬件厂商在不开放底层驱动源码的情况下提供硬件支持,保护了商业机密。 - 提高可移植性:
通过HAL,Android系统可以在不同的硬件平台上更容易地移植和适配 - 版本演进:
从Android 8.0开始,Google引入了Project Treble,对HAL架构进行了重新设计,引入了HIDL(HAL Interface Definition Language)来进一步规范化HAL接口
总之,HAL作为Android系统中承上启下的一层,在保护厂商利益、提高系统可移植性和标准化硬件接口等方面发挥了重要作用。
Android Runtime
ART是Android系统的核心组件之一,主要包括以下几个方面:
- 应用进程隔离每个应用都在其独立的进程中运行每个进程都有自己的虚拟机实例,实现应用间的隔离
- ART(Android Runtime)虚拟机执行DEX(Dalvik Executable)文件格式的字节码DEX是专为Android优化的字节码格式,内存占用小支持多个虚拟机实例并发运行
- ART主要功能AOT(Ahead-of-Time)预编译JIT(Just-in-Time)即时编译优化的垃圾回收(GC)机制调试支持
Android系统启动过程中,进程的创建遵循一定的层次结构:
- Linux内核启动
- init进程(PID 1)
- 用户空间的第一个进程
- 所有用户进程的始祖
- init进程派生的关键进程
- 系统守护进程:ueventd、logd、healthd、installd、adbd、lmkd等
- 重要系统服务:
- ServiceManager(Binder服务管理器)
- bootanim(开机动画)
- Zygote进程
- 由init进程创建
- Android系统的第一个Java进程(虚拟机进程)
- 所有Java应用进程的父进程
这种层次化的进程创建结构确保了Android系统的模块化设计和进程隔离,为系统的稳定性和安全性提供了基础。通过这种方式,Android能够有效管理系统资源,并为应用提供一个安全的运行环境。
FrameWork层
Media Server进程
Media Server进程与Zygote和System Server不同,它是由init进程直接fork创建的。其主要职责包括:
- 初始化并管理C++ framework层的多媒体服务AudioFlinger(音频服务)Camera Service(相机服务)
- 为上层Java framework提供底层多媒体功能支持
- 管理硬件抽象层(HAL)与内核驱动之间的交互
Media Server的存在使得Android系统能够高效地处理音频、视频等多媒体任务,为用户提供流畅的多媒体体验。
Zygote进程
Zygote进程是Android系统中的关键进程,由init进程通过解析init.rc配置文件而创建。其主要职责包括:
- 虚拟机初始化加载ZygoteInit类初始化Java虚拟机(ART或Dalvik)
- 资源预加载调用preloadClasses()预加载常用Java类调用preloadResources()预加载系统资源
- 建立IPC机制注册Zygote Socket服务端套接字,用于接收创建新应用进程的请求
- 孵化系统进程fork出System Server进程
Zygote进程的这些特性使其成为Android系统中所有Java进程的父进程,为应用程序的快速启动奠定了基础。
System Server进程
System Server是由Zygote进程fork而来的第一个子进程,其主要职责是启动和管理整个Java framework层的核心服务:
- 启动核心系统服务
- ActivityManagerService
- WindowManagerService
- PackageManagerService
- PowerManagerService
- 管理应用程序生命周期
- 处理系统级IPC请求
- 协调各个系统服务之间的交互
System Server进程的运行确保了Android系统的核心功能和服务的正常运作。
App层
- Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;
- Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。
- 所有的App进程都是由Zygote进程fork生成的。
Syscall && JNI
- Native与Kernel之间有一层系统调用(SysCall)层
- Java层与Native(C/C++)层之间的纽带JNI