Android 架构:应用程序层、框架、组件

Android 操作系统于 2008 年首次发布。即使在其初期,操作系统背后的团队也是建立在巨人肩膀之上的。除了 Android 操作系统表面显示的 UI 外,它还由多个层组成。这些层包括自定义代码和已持续开发数十年的开源技术。

Android 的开发得益于众多公司的巨大协作努力和投资。Android 开发背后的主要公司是 Google。其他公司包括三星、LG 等设备制造商;Intel 和 ARM 等处理器制造商,仅举几例。

当我们谈论 Android 架构时,我们指的是 Android 系统是如何设计的,如何分层以及如何构建以作为一个系统工作的。构建这样一个复杂的系统需要仔细的结构化,以确保所有组件协同工作。它的架构确保了许多组件能够作为一个整体正常运行而不崩溃。

以下是构成 Android 架构的层,如图所示

  1. 应用
  2. 应用程序框架
  3. Android 运行时和核心库
  4. Linux 内核

为移动设备开发操作系统会带来一系列挑战。使用这种分层架构可以确保不同的问题在不同的级别得到分解和解决。

分层架构有助于分离关注点,并确保 Android 软件开发者不必时刻处理底层问题。他们可以专注于交付与他们正在工作的层相关的业务价值。

开发者在制作应用程序时不必担心应用程序框架的实现。这项工作留给了正在从事应用程序框架的系统开发者。

应用程序框架开发者关注开发者体验,不必担心底层驱动程序。底层系统工程师可以完全专注于蓝牙或音频驱动程序等底层组件。

Android 的分层结构使得可以独立地对每个层进行错误修复或改进的更新。这确保了跨层的更改不会相互干扰。这使得在 OS 不同级别工作的人们可以在进行新的更新和发布时协同工作,而不会相互阻碍。

Android 应用程序

Android Application
Android 应用程序

这是最终用户与之交互的层。应用程序开发者在此层上发布他们的应用程序以供运行。

Android 默认自带一套应用程序,可以立即使用 Android 设备。

  1. 主屏幕:Android 主屏幕包含常用应用程序的启动器图标,最终用户可能希望快速访问。您可以通过单击这些应用程序的启动器来启动应用程序。屏幕的最顶部是显示网络、电池电量、日期和时间的小部件。
  2. 联系人:Android 默认提供存储和检索联系人的方式。联系人信息与其他应用程序共享以增强功能。
  3. 消息:Android 提供发送和接收短信的功能。
  4. 电子邮件:Android 支持原生电子邮件服务。设置 Android 设备需要一个 Gmail 帐户。设置 Gmail 会在 Android 设备上激活其他依赖电子邮件的组件。一些依赖电子邮件的功能包括安全和恢复机制。另一个依赖电子邮件的功能是访问 Play 商店,这是 Android 应用程序的市场。
  5. 浏览器:Android 自带默认浏览器。
  6. 通知抽屉:在屏幕上向下滑动可显示通知抽屉。它提供了用户应该注意的应用程序事件。在通知上方是一组常用的设备设置的快捷方式,用户可以切换。这些设置包括蓝牙和 Wifi 等各种硬件组件的开关。长按这些事件可以让我们导航到它们的配置页面。

此层也称为用户级别,与主要针对应用程序开发的底层形成对比。应用程序开发者在此层上创建和定制其应用程序的体验。应用程序层下方的层不被应用程序开发者定制。它们被认为是系统层的一部分。这些层由设备制造商、Google Android 团队或希望将其用于产品或研究的第三方使用 Android 源代码进行定制。

应用程序框架

Android OS 通过 Java API 公开了 Android 设备底层库和功能。这就是所谓的 Android 框架。该框架通过利用原生库公开了安全且统一的方式来利用 Android 设备资源。

Application Framework
应用程序框架

1) Activity Manager (活动管理器)

应用程序使用 Android activity 组件作为应用程序的入口点。Android Activities 是包含应用程序用户与之交互的用户界面的组件。当最终用户与 Android 设备交互时,他们会启动、停止并跳转到许多应用程序。每个导航事件都会触发各自应用程序中许多活动的激活和停用。

Android ActivityManager 负责在应用程序转换期间实现可预测和一致的行为。ActivityManager 为应用程序创建者提供了一个插槽,以便在 Android OS 执行全局操作时让他们的应用程序做出响应。应用程序可以监听设备旋转、由于内存不足而销毁应用程序、应用程序失去焦点等事件。

应用程序对这些转换做出反应的一些例子包括在手机通话期间暂停游戏活动、停止音乐播放。

2) Window Manager (窗口管理器)

Android 可以确定屏幕信息,以确定创建应用程序窗口所需的要求。窗口是我们查看应用程序 UI 的区域。Android 使用 Window manager 向应用程序和系统提供此信息,以便它们可以适应设备正在运行的模式。

Window Manager 有助于提供定制的应用程序体验。应用程序可以填满整个屏幕以获得沉浸式体验,或与其他应用程序共享屏幕。Android 通过允许每个应用程序的多窗口来实现这一点。

3) Location Manager (位置管理器)

大多数 Android 设备都配备了 GPS 设备,可以使用卫星信息获取用户位置,精度可达米级。程序员可以向用户请求位置权限,提供位置信息,并提供感知的体验。

Android 还可以利用无线技术进一步丰富位置信息,并在设备处于封闭空间时增加覆盖范围。Android 在 Location-Manager 的框架下提供这些功能。

4) Telephony Manager (电话管理器)

大多数 Android 设备都充当主要的电话设备。Android 使用 TelephoneManager 组合硬件和软件组件来提供电话功能。硬件组件包括 SIM 卡等外部零件,以及麦克风、摄像头和扬声器等设备零件。软件组件包括拨号盘、电话簿、铃声配置文件等原生组件。使用 TelephoneManager,开发者可以扩展或微调默认的通话功能。

5) Resource Manager (资源管理器)

Android 应用程序通常不仅仅包含代码。它们还包含其他资源,如图标、音频和视频文件、动画、文本文件等。Android 有助于确保高效、响应式地访问这些资源。它还确保将正确的资源交付给最终用户。例如,在填充应用程序中的字段时,会使用正确的语言文本文件。

6) View System (视图系统)

Android 还提供了一种轻松创建应用程序交互所需的常见视觉组件的方法。这些组件包括按钮等小部件、ImageView 等图像持有者、ListView 等显示项目列表的组件,以及更多。这些组件是预制的,但也可以进行定制以满足应用程序开发者的需求和品牌。

7) Notification Manager (通知管理器)

Notification Manager 负责告知 Android 用户应用程序事件。它通过在事件发生时向用户提供视觉、音频或振动信号或它们的组合来实现。这些事件具有外部和内部触发器。内部触发器的一些例子是低电量状态事件,它会触发一个通知来显示低电量。另一个例子是用户指定的事件,如闹钟。外部触发器的一些例子包括新消息或检测到新的 Wi-Fi 网络。

Android 提供了一种程序员和最终用户微调通知系统的方法。这有助于确保他们能够以最适合他们及其当前环境的方式发送和接收通知事件。

8) Package Manager (软件包管理器)

Android 还提供对已安装应用程序信息的访问。Android 跟踪应用程序信息,例如安装和卸载事件、应用程序请求的权限以及资源使用情况,如内存消耗。

这些信息可以使开发者能够根据配套应用程序提供的新功能来激活或停用其应用程序的功能。

9) Content Provider (内容提供者)

Android 使用内容提供者以标准化的方式在设备上的应用程序之间共享数据。开发者可以使用内容提供者将数据暴露给其他应用程序。例如,他们可以使应用程序数据可供外部搜索应用程序搜索。Android 本身使用相同的系统公开日历数据、联系人数据等数据。

Android 运行时和核心/原生库

Android Runtime and Core/Native Libraries

1) Android Runtime (Android 运行时)

Android 目前使用 Android Runtime (ART) 来执行应用程序代码。ART 前身是 Dalvik Runtime,它将开发者代码编译成 Dalvik Executable 文件(Dex 文件)。这些执行环境针对 Android 平台进行了优化,考虑了移动设备的处理器和内存限制。

运行时将程序员编写的代码转换为机器代码,进行计算并利用 Android 框架组件提供功能。Android 托管多个应用程序和系统组件,每个组件都在自己的进程中运行。

核心库

在本节中,我们将讨论 Android 操作系统中存在的一些核心库。

2) MediaFramework (媒体框架)

Android 还原生支持流行的媒体编解码器,使得在 Android 平台上创建的应用程序可以轻松地直接使用/播放多媒体组件。

3) SQLite

Android 还有一个 SQLite 数据库,它使应用程序能够在无需第三方库的情况下拥有非常快速的原生数据库功能。

4) FreeType

Android 配备了预装的快速灵活的字体引擎。这使得应用程序开发者能够为他们的应用程序组件设置样式,并提供丰富的体验来传达开发者的意图。

5) OpenGL

Android 还附带 OpenGL 图形系统。它是一个 C 库,有助于 Android 在 2D 和 3D 图形的实时渲染中使用硬件组件。

6) SSL

Android 还附带了一个内置的安全层,用于在 Android 上的应用程序与其他设备(如服务器、其他移动设备、路由器 6)之间实现安全通信。

7) SGL

Android 配备了一个用低级代码实现的图形库,可以有效地为 Android 平台渲染图形。它与 Android 图形管道的 Android 框架的更高级别组件协同工作。

8) Libc

Android 的核心包含用 C 和 C++ 编写的库,这些是面向嵌入式使用、旨在最大化性能的低级语言。Libc 提供了一种向这些库公开低级系统功能(如线程、套接字、IO 等)的方法。

9) Webkit

这是一个开源的浏览器引擎,用作构建浏览器的基础。4.4 KitKat 版本之前的默认 Android 浏览器使用它来渲染网页。它使应用程序开发者能够通过使用 WebView 在视图系统中渲染 Web 组件。这使得应用程序能够将 Web 组件集成到其功能中。

10) Surface Manager (Surface 管理器)

Surface manager 负责确保应用程序屏幕的平滑渲染。它通过组合 2D 和 3D 图形进行渲染来实现。它还通过进行屏幕外缓冲来实现这一点。

Linux 内核

Android 系统的根组件是 Linux 内核。它是实现 Android 所有功能的基础。

Linux Kernel

Linux 内核是一段经过充分考验的软件,已用于开发从超级计算机到小型设备的各种操作系统的软件。它具有有限的处理能力,例如用于物联网 (IoT) 的小型网络设备。

Linux 内核可以根据设备规格进行调整,以便制造商能够制造具有不同功能的 Android 设备以匹配用户体验。

就 Android 而言,内核负责许多基础功能,包括但不限于以下几点:

  1. 设备驱动程序
  2. 内存管理
  3. 进程管理

让我们详细介绍一些功能

设备驱动程序

Linux 内核包含使操作系统能够与不同硬件组件协同工作的驱动程序。这些驱动程序提供了标准接口,使来自不同制造商的硬件组件能够与之协同工作。

这使得设备制造商能够采购不同的组件,例如蓝牙组件、Wi-Fi 组件、摄像头组件。只要制造商符合 Android 标准规范,集成就是无缝的。

1) USB 驱动程序

Linux 还为 Android 提供了一种与 USB 设备交互的方式。现代设备配备不同的 USB 端口,包括 USB 2.0 和新的 USB 版本,包括 USB-C。这些驱动程序允许使用 USB 端口为 Android 设备充电、传输实时数据(如日志)以及与 Android 文件系统交互。

2) 蓝牙驱动程序

Linux 内核支持与蓝牙硬件组件的交互。它提供了一种读取和写入从支持的蓝牙无线电频率接收到的数据的方法。它还提供了一套用于 Android 配置蓝牙的工具。

3) Wi-Fi 驱动程序

Linux 内核提供驱动程序来集成 Wi-Fi 网络硬件组件。嵌入移动设备中的 Wi-Fi 组件使 Android 设备能够连接到 Wi-Fi 网络。驱动程序使 Wi-Fi 组件能够广播 Wi-Fi 网络并创建热点。

4) 显示驱动程序

Android 使得与显示组件交互成为可能。对于大多数设备,接口组件是 LCD 触摸屏。它支持配置和绘制像素。

5) 音频驱动程序

Android 设备通常配备用于音频输入和输出的硬件组件。内核中的音频驱动程序使 Android 系统能够使用从这些组件接收到的音频,并产生音频输出。

6) Power Manager (电源管理器)

大多数 Android 设备在使用时都与电源插座断开连接。因此,它们很大程度上依赖电池供电。Linux 内核带有一个可配置的电源管理系统,可以满足使用它的设备的需求。

Android OS 使用电源管理器使设备上的其他组件能够感知电源。它通过广播各种与电源相关的状态来实现这一点。这些状态是待机、睡眠和低电量。在 Android 上,电源管理器被调整为默认进入睡眠模式,以确保最大化的电池寿命。

电源管理器提供应用程序对不同电源模式做出反应的方式。应用程序还可以更改其行为以匹配设备的当前电源状态。

应用程序还可以请求更改默认电源策略。应用程序可以实现所需的功能,例如保持硬件组件处于活动状态。一个例子是在阅读书籍时保持屏幕活动,以确保用户不被打扰。另一个例子是在后台听音乐时保持音频组件开启。

7) Flash Memory (闪存)

大多数 Android 设备使用闪存作为存储手段。闪存速度快且占用空间少,非常适合小型设备。Linux 内核为 Android 设备提供了读写闪存的方式。它提供了一种分区内存的方式,使操作系统和其他应用程序可以轻松高效地共享内存资源。

8) Binder

Android 托管许多应用程序和系统组件,每个组件都在自己的进程中运行。在大多数情况下,这些进程应该是相互隔离的,以防止干扰和数据损坏。然而,有时我们也希望在进程之间传递数据。

Linux 内核通过提供 binder 驱动程序来实现数据共享功能。Binder 驱动程序支持进程间通信 (IPC)。使用 IPC,进程可以发现其他进程并共享信息。

内存管理

Linux 内核的另一项职责是内存管理。当不同的应用程序运行时,内核确保它们使用的内存空间不会冲突并覆盖彼此。

它还有助于确保所有正在运行的应用程序都获得足够的内存来运行,从而确保没有一个应用程序占用过多空间。

进程管理

Android 中的每个应用程序都在一个进程中运行。内核还负责管理进程。这意味着它负责创建、暂停、停止、关闭或终止进程。

内核支持各种功能,例如同时运行多个进程、进程之间的通信、在后台运行进程等。

由于每个进程都需要自己的内存空间才能正常运行,因此内核会确保为每个进程分配的内存空间不被其他进程保护。它还确保在进程关闭时释放分配给进程的 RAM 等资源。

Linux 内核还负责将工作分发给设备中的处理器。这使得高性能多核设备成为可能,因为不同的应用程序将拥有在不同核心上运行的进程。

Linux 内核在后台执行更多任务,包括强制执行安全。

摘要

  • Android 架构组织成层。
  • 每一层都解决一组独特的问题。
  • 最终用户在应用程序层与应用程序交互。
  • 应用程序开发者为应用程序层开发应用程序。他们通过应用程序框架提供的工具和抽象来实现这一点。
  • Android 框架层通过在原生库之上创建 API 来简化对底层组件的访问。
  • Android 运行时和核心库使用低级语言以及针对移动设备的优化。这确保了应用程序开发者编写的代码即使在 Android 设备受限的情况下也能流畅运行。
  • Android 软件堆栈的最底层是 Linux 内核。它与 Android 设备中常见的硬件组件进行接口。