Android 操作系统的解剖






4.12/5 (14投票s)
Android 操作系统的运行状态
引言
Android 是一个基于 Linux 的开源软件栈,包含操作系统、中间件、原生移动应用程序以及一套用于构建第三方应用程序的 API(应用程序编程接口)库。它主要为智能手机、平板电脑等触摸屏移动设备而设计,如今其应用范围已扩展到其他嵌入式系统。最初由 Android Inc.(成立于 2003 年,总部位于加利福尼亚州帕洛阿尔托)开发,该公司后来成为 Google 的子公司,并于 2005 年被 Google 收购。
Android 于 2007 年首次公开宣布,第一款手机于 2008 年 10 月上市。这是对 Android 及其历史的简要介绍。
背景
Android OS 的内核是 Linux,它使用 Linux 内核 2.6 和 3.x(Android 4.0 及更高版本),因此 Android 是一个基于 Linux 的操作系统。
请注意:虽然 Android OS 的内核是 Linux,但 Android 并不是一个 Linux 操作系统,因为它不包含完整的 Linux 工具集。
为什么选择 Linux 内核
- 开源
- 支持共享库
- 成熟的驱动程序模型
- 基于权限的安全模型
Android 框架结构详解
Android OS 由内核、库、应用程序框架和应用程序四个主要层组成,如图所示。每一层都发挥着重要作用,我将一一为您讲解。
内核
整个 Android OS 构建在 Linux 2.6 内核之上,并进行了一些额外的架构更改,以方便移动设备的功能,包括内存管理和电源管理。正是这个 Linux 与硬件交互,并包含所有必需的硬件驱动程序。选择 Linux 是因为它已经开源,在桌面系统中有成熟的记录,并且在许多情况下不需要重写驱动程序。Linux 提供了诸如虚拟内存、网络、驱动程序、电源管理、进程间通信(IPC)和调试器等功能。
应用程序和服务在单独的进程中运行,但需要共享相同的数据并进行通信,因此这可能导致重大的安全漏洞,并且进程在进行 IPC 时可能出现死锁。
解决方案是创建:
- 一个名为 Binder(IPC)驱动程序的驱动程序,用于促进 IPC。
- 启用共享内存
- 用于处理请求的预处理池
- 进程之间的同步调用
另一个问题是电源管理。由于手机使用容量有限的可充电电池。内核中还包含另一个定制驱动程序,称为电源管理驱动程序(PM),它构建在标准的 Linux 电源管理驱动程序之上,具有:
- 更具调节性的电源管理策略
- 组件通过“唤醒锁”调用以保持电源开启
- 支持更多唤醒锁
http://git.android.com 可获取完整的 Android 内核源代码。
库
Android 框架附带 9 个原生库,但也可以向此层添加第三方库。
这些原生库可分为以下几类:
- 原生服务器
- 功能库
- Bionic Libc 和
- 硬件抽象层
原生服务器
这些包括:
Surface Manager:负责渲染 2D 和 3D 图形。
OpenGL ES:也负责 2D 和 3D 渲染,并支持不同的硬件加速器。
Audio Manager:管理所有音频输出设备。
功能库
这些包括:
SQLite:一个轻量级关系数据库。充当大多数平台数据存储的后端。
WebKit:基于开源 WebKit 浏览器:https://webkit.ac.cn,支持完整的 CSS、JavaScript、DOM、AJAX,使程序员能够构建基于浏览器的应用程序。
媒体框架:支持标准的视频、音频、静态图像格式。
Bionic Libc
此库专门为满足移动设备(如内存管理、有限的 CPU 功耗)的限制而构建,因此此库允许小尺寸和快速的代码路径,从而实现非常快速且小巧的自定义 pthread 实现。
硬件抽象层
此层负责将 Android 逻辑与硬件接口分离。此层主要包含用户 C/C++ 库,因此也可以使用 C、C++ 等多种语言的原生开发 Android。
它还提供了一个 Android 需要硬件驱动程序实现的接口。
此层的重要性
- 并非所有组件都有标准化的内核驱动程序接口,因此此层为未知组件提供了这些驱动程序。
- Android 对硬件驱动程序有特定要求。
Android运行时
这包括两个层,其中包含:
- 核心 Java 库:完全用 Java 编写,具有核心 Java 语言 API,提供了一个强大、 yet
简单且熟悉的开发平台。
• 数据结构
• 工具
• 文件访问
• 网络访问
• 图形 - Dalvik 虚拟机:Android 自定义的、完全独立实现的虚拟机,满足移动设备的限制。
• 提供应用程序的可移植性和运行时一致性。
• 运行优化文件格式(.dex)和 Dalvik 字节码。
• Java .class / .jar 文件在构建时转换为 .dex。
• 支持每个设备多个虚拟机进程。
• 高度 CPU 优化的字节码解释器。
• 非常高效地使用运行时内存。
应用程序框架
这包含了您或任何程序员创建的应用程序将使用的核心系统服务,它们在后台运行,即应用程序不直接访问它们,它们分为两类:
- 核心平台服务 • Activity Manager
• Package Manager
• Window Manager
• Resource Manager
• Content Providers
• View System - 硬件服务 • Telephony Service
• Location Service
• Bluetooth Service
• WiFi Service
• USB Service
• Sensor Service
例如,要使用 Location Service 来获取用户的 GPS 位置,您需要请求 Location Service。
LocationManager lm = (LocationManager)
Context.getSystemService(Context.LOCATION_SERVICE);
运行时周期
与大多数基于 Linux 的系统一样,在启动时,引导加载程序加载 Linux 内核并启动init 进程。
Init 启动 Linux 守护进程,包括:
- USB 守护进程 (usbd) 来管理 USB 连接。
- Android Debug Bridge (adbd) 来管理 ADB 连接。
- 调试器守护进程 (debuggerd) 来管理调试进程请求(转储内存等)。
- Radio Interface Layer Daemon (rild) 来管理与无线电的通信。
Init 进程启动 Zygote 进程。
- 初始化 Dalvik VM 实例。
- 加载类并侦听套接字以请求生成 VM。
- 根据请求分叉以创建托管进程的 VM 实例。
注意:Zygote 和 Dalvik VM 是虚拟进程。
Dalvik VM 然后初始化原生系统服务器,包括 Surface
Flinger 和 Audio Flinger。服务器加载完所有系统服务后,系统就准备就绪了。
注意:每个后续应用程序都在自己的进程中启动。