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

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 应用。主要类别有:

二、基本架构
1. 经典分层架构图
先来看一张 Google 官方提供的经典分层架构图(下图左侧),从下往上依次分为 Linux 内核、HAL、系统 Native 库和 Android 运行时环境、Java 框架层以及应用层这 5 层架构,其中每一层都包含大量的子模块或子系统。
![]() | ![]() |
AOSP 软件堆栈架构如上图右边,即我们说的 android 系统架构,这个图是来自于 AOSP 官网,可能会发生更新,但基本就是上面那几层。
可参考:
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:原生守护程序和库。
该层中的本机守护进程包括 init 、 healthd 、 logd 和 storaged 。这些守护进程直接与内核或其他接口交互,不依赖于基于用户空间的 HAL 实现。
该层中的本机库包括 libc 、 liblog 、 libutils 、 libbinder 和 libselinux 。这些本机库直接与内核或其他接口交互,不依赖于基于用户空间的 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 内部的环环相扣的内在联系。

Android 系统启动过程由上图从下往上的一个过程是由 Boot Loader 引导开机,然后依次进入→ Kernel → Native → Framework → App。
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。
参考资料:

