Android系统框架
Android系统框架采用分层结构,由下至上依次为:
硬件层:
-
Android系统的物理基础,包括CPU、GPU、RAM等硬件组件
Linux内核层(Linux Kernel):
- Linux内核负责管理硬件、内存和系统进程,提供设备驱动程序,确保设备的安全性和稳定性
硬件抽象层(Hardware Abstraction Layer,HAL):
-
HAL允许Android在不同硬件上运行,为硬件厂商提供标准接口,实现硬件与上层软件的解耦
-
HAL层运行在用户空间中
-
硬件抽象层 (HAL) 提供标准界面, 向更高级别的 Java API 框架显示设备硬件功能。 HAL 包含多个库模块, 其中每个模块都为特定类型的硬件组件实现一个界面, 例如相机或蓝牙模块。 当框架API 要求访问设备硬件时, Android 系统将为该硬件组件加载库模块。
Android运行时(Android Runtime,ART):
- 运行时库分为核心库和 ART(Android 5.0 之后, Dalvik 虚拟机被 ART 取代)。
- 核心库与 API:
- Java 核心库:ART 提供了一组核心 Java 库,包括 java.lang、java.util 等,支持应用的基本功能。
- Android API:ART 集成了 Android 框架 API,如 android.app、android.content 等,提供访问系统功能和硬件资源的接口。
- ART功能:
- 编译与执行机制
- Ahead-of-Time (AOT) 编译:ART 默认使用 AOT 编译,在应用安装时将字节码编译为机器码,存储在设备上,从而提高应用的启动和执行速度。
- Just-In-Time (JIT) 编译:从 Android 7.0(API 级别 24)开始,ART 引入 JIT 编译,能够在运行时动态编译和优化代码,进一步提升性能。
- 内存管理与垃圾回收
- 内存管理:ART 提供高效的内存管理系统,负责分配和回收应用的内存。
- 垃圾回收 (GC):ART 使用多种垃圾回收算法,如分代回收和并发标记清除,以减少回收过程中的停顿时间,提升用户体验。
- 安全机制
- 应用沙盒:每个 Android 应用都在自己的沙盒环境中运行,限制其对其他应用和系统资源的访问。
- 权限管理:ART 与系统权限管理协同工作,确保应用只能访问已授权的资源和功能。
- 调试与性能分析
- 调试支持:ART 提供调试工具,如 adb 和 ddms,帮助开发者调试和分析应用。
- 性能分析:ART 提供性能分析工具,如 traceview 和 systrace,帮助开发者优化应用性能。
- 编译与执行机制
原生守护进程和库(Native Daemons and C/C++Libraries):
-
原生守护进程:包括init、healthd、logd等,负责系统初始化、健康监测、日志记录等关键任务。
-
原生库:如libc、liblog、libutils等,提供底层功能,如内存管理、字符串操作等。
-
其他主要的库:
-
Media Framework:支持流行的媒体编解码器,使应用能够轻松地使用和播放多媒体组件
- SQLite:一个轻量级的嵌入式关系数据库,为应用提供快速的本地数据库功能
- Freetype:一个快速且灵活的字体引擎,使开发者能够为应用组件设置样式,提供丰富的文本显示体验
- SSL:用于实现 Android 设备与其他设备(如服务器、其他移动设备、路由器等)之间的安全通信
- SGL:一个用低级代码实现的图形库,能够高效地为 Android 平台渲染图形,与 Android 图形管道的更高级组件协同工作
- Surface Manager:负责确保应用屏幕的平滑渲染,通过组合 2D 和 3D 图形进行渲染,并通过离屏缓冲提高渲染效率
- OpenGL ES: Android 系统中用于 2D 和 3D 图形绘制的开放图形库,基于 OpenGL ES 1.0 API 标准实现,支持生成二维、三维图像。在 Android 系统中,OpenGL ES 与 EGL 紧密配合,负责图形的渲染和显示。当应用需要进行 3D 图形渲染时,Android 系统会调用 OpenGL ES 提供的函数来完成相应的绘制工作。
- WebKit: 一个开源的浏览器引擎,用于驱动 Android 浏览器和内嵌的 WebView。它负责解析和渲染 HTML、CSS 和 JavaScript 等网页内容。在 Android 系统中,WebKit 使得应用程序能够嵌入网页视图,实现与网页的交互。例如,当一个应用需要显示网页内容时,可以通过 WebView 来加载和显示网页,而 WebView 内部则使用 WebKit 来进行渲染
- OpenMax AL :原生多媒体处理的重要组成部分。它提供了一组 C 语言接口,使得开发者可以直接从原生代码(C/C++)中调用这些接口进行音视频处理。
-
应用框架层(Application Framework,Java API):
- 提供系统API,以Java类、接口和预编译代码的形式为应用程序提供高层次服务
- 管理类:
- Activity Manager:管理应用程序的生命周期和活动栈。
- Resource Manager:提供对非代码资源的访问。
- Notifications Manager:管理应用程序的用户通知。
- Window Manager:管理应用程序的窗口。
- Package Manager:管理应用程序的安装和卸载。
- Telephony Manager:提供对电话功能的访问。
- Location Manager:提供对设备位置信息的访问。
- 其他的还有传感器管理、wifi管理、网络连接管理、电源管理、蓝牙管理等
- Content Providers:允许应用程序之间共享数据。
- View System:提供创建用户界面的视图集合。
应用层(Application Layer, APP):
- 位于最顶层,包括系统应用和用户安装的应用,这些应用利用应用框架提供的API与底层系统交互。
Android系统启动流程
Loader 层
- Boot ROM:设备加电后,首先运行 Boot ROM 中的代码,它负责初始化硬件并加载第一阶段的 Bootloader。Boot ROM 是固化在设备中的只读存储器,其主要功能是启动设备的硬件并加载后续的启动程序。
- Bootloader:通常分为多个阶段(如 Primary 和 Secondary),负责验证签名、加载内核和 initramfs 到内存。常见的 Bootloader 如 U-Boot 或厂商定制版本。它会初始化设备的硬件环境,设置启动参数,并最终将控制权交给内核。
Kernel 层
- swapper 进程(idle 进程):内核启动后,首先创建 swapper 进程(pid=0),它是系统初始化过程中内核创建的第一个进程,用于初始化进程管理、内存管理等相关工作。接着 swapper 进程会创建两个进程:kthreadd 进程(pid=2)和 init 进程(pid=1)。
- kthreadd 进程:kthreadd 进程是 Linux 系统的内核进程,会创建内核工作线程 kworker、软中断线程 ksoftirqd、thermal 等一系列内核守护进程。kthreadd 进程是所有内核进程的鼻祖。
- 内核进程管理:内核负责进程的创建、调度和管理。进程调度器根据调度算法选择合适的进程在 CPU 上运行,以实现多任务的并发执行。内核还提供了进程间通信(IPC)机制,如信号量、消息队列等,以便进程之间进行数据交换和同步。
- 内核 init 进程
- 内核通过调用 start_kernel 函数进入内核启动阶段,在 rest_init 函数中通过 kernel_thread 函数创建 init 进程(pid=1)。
- 加载驱动:init 进程调用kernel_init_freeable----do_basic_setup----do_initcalls等函数加载Display、Camera Driver、Binder Driver 等驱动
- 内核 init 进程变成用户态:init 进程一开始运行于内核态,属于一个内核线程。它通过挂载根文件系统,并运行用户空间的 init 程序,完成从内核态到用户态的转变。
Native 层
- init 进程初始化:
- 第一阶段:初始化基本系统环境,如设置内核参数、挂载必要的文件系统等。还会初始化 Android 属性服务和 SELinux。
- 第二阶段:执行 init.rc 脚本,启动系统服务,如 ueventd、servicemanager、zygote 等。
- Zygote 进程启动:Zygote 是 Android 应用程序的孵化器,它预加载常用的类库和资源,为应用程序的快速启动做准备。Zygote 通过复制自身来创建新进程,因此具有较快的启动速度。
- 启动 SystemServer:SystemServer 是 Android 系统服务的容器,负责启动各种系统服务。它会加载多个系统服务,如 ActivityManagerService 和 WindowManagerService。
- HAL 层:HAL(Hardware Abstraction Layer)位于 Native 层和 Linux 内核驱动之间,为 Android 框架提供统一的硬件接口,屏蔽硬件差异。HAL 包含多个库模块,每个模块为特定类型的硬件组件实现一个界面,如音频、蓝牙、相机、传感器等。
- bootanim 服务:在 init 进程的第二阶段,会启动 bootanim 服务,该服务负责显示 Android 系统的开机动画,直到系统完全启动并准备好用户界面。
Framework 层
- SystemServer 初始化:SystemServer 进程启动后,初始化各种系统服务,如 ActivityManagerService、PackageManagerService、WindowManagerService 等。
- 系统服务启动:各个系统服务根据自身的职责进行初始化,如 ActivityManagerService 负责管理应用程序的活动,PackageManagerService 负责管理应用程序的安装和卸载等。
- 启动 Launcher:当系统服务准备就绪后,启动 Launcher(主屏幕)应用程序,为用户提供交互界面。
App 层
- 应用程序启动:用户点击应用程序图标后,系统通过 ActivityManagerService 发送请求到 Zygote 进程,Zygote 进程会 fork 自己创建一个新进程,这个新进程就是应用程序的进程。新进程会继承 Zygote 进程预加载的类库和资源,从而加快应用程序的启动速度。
- ActivityThread 创建:每个应用程序都有一个独立的进程,在应用程序启动时,创建 ActivityThread,用于管理应用程序的组件和消息循环。
- 应用程序组件启动:ActivityThread 启动应用程序的组件,如 Activity、Service、BroadcastReceiver 等,完成应用程序的初始化和运行。