Skip to content

LV005-安卓简介

一、Android 概述

1. 什么是 Android?

Android 是 Google 开发的基于 Linux 平台的、开源的、智能移动设备操作系统。主要应用于移动设备,如智能手机和平板电脑,由美国 Google 公司和开放手机联盟领导及开发。Android 包括操作系统、中间件和应用程序,由于源代码开放,Android 可以被移植到不同的硬件平台上。

image-20251125163535935

Android 移动应用开发者工具 – Android 开发者 | Android Developers

Android 操作系统最初由安迪·鲁宾开发,主要支持手机。2005 年 8 月由 Google 收购注资。2007 年 11 月,Google 与 84 家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良 Android 系统。随后 Google 以 Apache 开源许可证的授权方式,发布了 Android 的源代码。第一部 Android 智能手机发布于 2008 年 10 月。Android 逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。

2. AOSP

Google 将 Android 源码进行了开源称为 AOSP(Android Open Source Project,Android 开源项目)。它是一个由 Google 维护的完全免费和开放的操作系统开发项目。是 Android 系统的核心基础,提供了构建移动操作系统所需的基本组件。

相关文档可以看这里:Android 操作系统源代码文档 | Android Open Source Project

3. Android 应用程序

Android 应用程序一般使用 Android 软件开发工具包,采用 Java 语言来开发。市场上有许多 Android 应用。主要类别有:

image

二、基本架构

1. 经典分层架构图

先来看一张 Google 官方提供的经典分层架构图(下图左侧),从下往上依次分为 Linux 内核、HAL、系统 Native 库和 Android 运行时环境、Java 框架层以及应用层这 5 层架构,其中每一层都包含大量的子模块或子系统。

android-stackimage-20251125200343376

AOSP 软件堆栈架构如上图右边,即我们说的 android 系统架构,这个图是来自于 AOSP 官网,可能会发生更新,但基本就是上面那几层。

可参考:

平台架构 | Platform | Android Developers

架构概览 | Android Open Source Project

1.1 应用层(System Apps)

这是用户直接与之交互的层次,包括 Android app、Privileged app、Device manufacture app 等应用程序,system apps 的意思就是手机系统中的 apps,应用层代码使用 java 开发。

  • 安卓应用(Android app):仅使用 Android SDK 中的 Android API 创建的应用程序。
  • 特权应用程序(Privileged app):结合使用 Android 和系统 API 创建的应用程序。这些应用程序必须作为特权应用程序预安装在设备上。
  • 设备制造应用程序(Device manufacture app):使用 Android API、系统 API 和直接访问 Android 框架实现的组合创建的应用程序。

1.2 应用框架层(Java API Framework)

这一层是 Java 编写的,所以称为 Java API。Android 4 大组件,6 大布局,view 等系统定义的原生组件都在这层。由于 Framkwork 层和 Android SDK 是有交集的(或者是包含关系),旧版本中其实是把 Framework 层和 Android SDK 合并作为一层去介绍了。

  • Framework 层

又称安卓框架。一组 Java 类、接口和其他构建应用程序的预编译代码。该框架的某些部分可通过使用 Android SDK 的 Android API 公开访问。Android 框架代码在应用进程中运行。

  • Android SDK = Android API + System API

又称安卓开发工具包。一个软件开发工具包,用于创建与 Android 框架交互的应用程序。 Android SDK 由适用于所有应用程序的 Android API 和仅适用于特权应用程序的系统 API 组成。

系统 API :表示仅供合作伙伴和 OEM 纳入捆绑应用的 Android API。这些 API 在源代码中被标记为 @SystemApi。

Android API:是面向第三方 Android 应用开发者的公开 API。如需了解 Android API,请参阅 Android API 参考文档

后续的源码阅读会经常看到 ActivityManagerService(AMS)、WindowManagerService(WMS)这些,这些都是 FrameWork 层的源码。

名称 功能描述
Activity Manager(活动管理器) 管理各个应用程序生命周期,以及常用的导航回退功能
Location Manager(位置管理器) 提供地理位置及定位功能服务
Package Manager(包管理器) 管理所有安装在 Android 系统中的应用程序
Notification Manager(通知管理器) 使得应用程序可以在状态栏中显示自定义的提示信息
Resource Manager(资源管理器) 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
Telephony Manager(电话管理器) 管理所有的移动设备功能
Window Manager(窗口管理器) 管理所有开启的窗口程序
Content Provider(内容提供者) 使得不同应用程序之间可以共享数据
View System(视图系统) 构建应用程序的基本组件

1.3 系统服务(System services)

这个是五层架构中没有提及的部分,是在新版中单独分离出来的一层。系统服务是模块化的、集中的组件,例如 system_server 、SurfaceFlinger 和 MediaService。

Android 框架 API 提供的功能可以与系统服务进行通信,以访问底层硬件。所以它夹在应用框架层和运行库层之间。

1.4 Android 运行时(Android run time)

这是连接应用层和硬件抽象层的核心层。它包括核心库(Core Libraries)和 Art 虚拟机(ART)。核心库提供了许多 Java 核心库和 Android 核心库,用于支持应用的运行和开发。虚拟机是 Android 平台上的运行时环境,负责将应用程序的字节码转换为本机机器码,并执行应用程序。

旧版中系统运行库包括 native 库和 ART 库。新版中两者是分开的,而且并不在同一层,旧版中的本机 C/C++库,在新版中扩展为本机的进程和库。

  • ART 库:Android run time 是 AOSP 提供的 Java 应用运行环境。所以我们的程序采用 Java 语言编写, 程序在 Android 运行时中执行。ART 将应用程序的字节码转换为特定于处理器的指令,这些指令由设备的运行时环境执行。

运行时库包括核心库和 ART(Android5.0 后,Dalvik 被 ART 取代),其中核心库提供了 Java 语言核心库的大多数功能,这样开发者可以使用 Java 语言来编写 Android 应用。

  • Native daemons and libraries:原生守护程序和库。

该层中的本机守护进程包括 inithealthdlogdstoraged 。这些守护进程直接与内核或其他接口交互,不依赖于基于用户空间的 HAL 实现。

该层中的本机库包括 libclibloglibutilslibbinderlibselinux 。这些本机库直接与内核或其他接口交互,不依赖于基于用户空间的 HAL 实现。

1.5 硬件抽象层(HAL)

HAL(Hardware Abstraction Layer) 是一个抽象层,其中包含硬件供应商要实现的标准接口。HAL 让 Android 无需关注较低级别的驱动程序实现。借助 HAL,我们可以顺利实现相关功能,而不会影响或更改更高级别的系统。如需了解详情,请参阅 HAL 概览

总的来说,这一层提供了各种硬件设备和底层库的接口。它隐藏了不同硬件之间的差异,为上层提供了一致的硬件访问方式。HAL 主要负责处理与硬件设备的交互,如相机、蓝牙、传感器等。

1.6 Linux 内核层(Linux Kernel)

作为任何操作系统的核心部分,内核与设备上的底层硬件进行对话。在可能的情况下,AOSP 内核被拆分为与硬件无关的模块和特定于供应商的模块。

andriod 内核是基于 Linux 内核的,在此基础上添加了关于安卓的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。如需了解 AOSP 内核组件的说明(包括其定义),请参阅 内核概览

其中的驱动包括:音频(Audio)、android IPC 机制(Binder 机制)跨进程通讯、显示 (Display)主要是屏幕显示、按键(Keypad) 处理按键的分发等、蓝牙(BlueTooth)、相机(Camera)、内存分配与共享(Shared Memory)、USB、WIFI、电源管理(power management)

2. 系统启动架构图

上面的分成架构图采用 静态分层 方式的架构划分,众所周知,程序代码是死的,系统运转是活的,各模块代码运行在不同的进程(线程)中,相互之间进行着各种错终复杂的信息传递与交互流,从这个角度来说此图并没能体现 Android 整个系统的内部架构、运行机理,以及各个模块之间是如何衔接与配合工作的。

Google 提供的 5 层架构图很经典,但为了更进一步透视 Android 系统架构,我们以分层的架构来诠释 Android 系统的全貌,来了解 Android 内部的环环相扣的内在联系。

process_status

Android 系统启动过程由上图从下往上的一个过程是由 Boot Loader 引导开机,然后依次进入→ KernelNativeFrameworkApp

2.1 Loader 层

  • Boot ROM: 当手机处于关机状态时,长按 Power 键开机,引导芯片开始从固化在 ROM 里的预设代码开始执行,然后加载引导程序到 RAM
  • Boot Loader:这是启动 Android 系统之前的引导程序,主要是检查 RAM,初始化硬件参数等功能。

2.2 Linux 内核层

Android 平台的基础是 Linux 内核,比如 ART 虚拟机最终调用底层 Linux 内核来执行功能。Linux 内核的安全机制为 Android 提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。

  • 启动 Kernel 的 swapper 进程(pid = 0):该进程又称为 idle 进程, 系统初始化过程 Kernel 由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载 Display, Camera Driver,Binder Driver 等相关工作;
  • 启动 kthreadd 进程(pid = 2):是 Linux 系统的内核进程,会创建内核工作线程 kworkder,软中断线程 ksoftirqd,thermal 等内核守护进程。kthreadd进程是所有内核进程的鼻祖

2.3 硬件抽象层 (HAL)

硬件抽象层 (HAL) 提供标准接口,HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如 WIFI/蓝牙模块,当框架 API 请求访问设备硬件时,Android 系统将为该硬件加载相应的库模块。

2.4 Android Runtime & 系统库

每个应用都在其自己的进程中运行,都有自己的虚拟机实例。ART 通过执行 DEX 文件可在设备运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式文件,经过优化,使用内存很少。ART 主要功能包括:预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC),以及调试相关的支持。

这里的 Native 系统库主要包括 init 孵化来的用户空间的守护进程、HAL 层以及开机动画等。启动 init 进程(pid = 1), 是 Linux 系统的用户进程,init 进程是所有用户进程的鼻祖。

  • init 进程会孵化出 ueventd、logd、healthd、installd、adbd、lmkd 等用户守护进程;
  • init 进程还启动 servicemanager(binder 服务管家)、bootanim(开机动画)等重要服务
  • init 进程孵化出 Zygote 进程,Zygote 进程是 Android 系统的第一个 Java 进程(即虚拟机进程),Zygote是所有Java进程的父进程,Zygote 进程本身是由 init 进程孵化而来的。

2.5 Framework 层

  • Zygote 进程,是由 init 进程通过解析 init.rc 文件后 fork 生成的,Zygote 进程主要包含:

(1)加载 ZygoteInit 类,注册 Zygote Socket 服务端套接字

(2)加载虚拟机

(3)提前加载类 preloadClasses

(4)提前加载资源 preloadResouces

  • System Server 进程,是由 Zygote 进程 fork 而来,System Server 是 Zygote 孵化的第一个进程,System Server 负责启动和管理整个 Java framework,包含 ActivityManager,WindowManager,PackageManager,PowerManager 等服务。
  • Media Server 进程,是由 init 进程 fork 而来,负责启动和管理整个 C++ framework,包含 AudioFlinger,Camera Service 等服务。

2.6 App 层

  • Zygote 进程孵化出的第一个 App 进程是 Launcher,这是用户看到的桌面 App;
  • Zygote 进程还会创建 Browser,Phone,Email 等 App 进程,每个 App 至少运行在一个进程上。
  • 所有的 App 进程都是由 Zygote 进程 fork 生成的。

2.6 Syscall && JNI

  • Native 与 Kernel 之间有一层系统调用(SysCall)层。
  • Java 层与 Native(C/C++)层之间的纽带 JNI。

参考资料:

Android 操作系统架构开篇 - Gityuan 博客 | 袁辉辉的技术博客

Android 系统架构图_软件静态架构图-CSDN 博客

安卓进阶之 android 系统架构_system apps-CSDN 博客