65.9K
CodeProject 正在变化。 阅读更多。
Home

Android 操作系统的解剖

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.12/5 (14投票s)

2014年8月4日

CPOL

5分钟阅读

viewsIcon

24458

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 个原生库,但也可以向此层添加第三方库。

这些原生库可分为以下几类:

  1. 原生服务器
  2. 功能库
  3. Bionic Libc 和
  4. 硬件抽象层

原生服务器

这些包括:

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运行时

这包括两个层,其中包含:

  1. 核心 Java 库:完全用 Java 编写,具有核心 Java 语言 API,提供了一个强大、 yet
    简单且熟悉的开发平台。
    • 数据结构
    • 工具
    • 文件访问
    • 网络访问
    • 图形
  2. Dalvik 虚拟机:Android 自定义的、完全独立实现的虚拟机,满足移动设备的限制。
    • 提供应用程序的可移植性和运行时一致性。
    • 运行优化文件格式(.dex)和 Dalvik 字节码。
    • Java .class / .jar 文件在构建时转换为 .dex。
    • 支持每个设备多个虚拟机进程。
    • 高度 CPU 优化的字节码解释器。
    • 非常高效地使用运行时内存。

应用程序框架

这包含了您或任何程序员创建的应用程序将使用的核心系统服务,它们在后台运行,即应用程序不直接访问它们,它们分为两类:

  1. 核心平台服务 • Activity Manager
    • Package Manager
    • Window Manager
    • Resource Manager
    • Content Providers
    • View System
  2. 硬件服务 • 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。服务器加载完所有系统服务后,系统就准备就绪了。

注意:每个后续应用程序都在自己的进程中启动。

© . All rights reserved.