Android 是构建在 Linux 基础之上的,下图所示为 Android 系统的主要分层架构。
Linux 内核层 (Linux kernel)
Android 的核心系统服务基于 Linux 内核,再次基础上添加了部分 Android 专用的驱动。这些驱动通常与硬件无关,而是为了上层软件服务的,他们包括以下内容:
- Binder 进程间通讯(IPC)基础设施
- Ashmem 匿名共享内存
- lowermemorykiller 进场回收模块
- logger 日志相关
- wakelock 电源管理相关
- Alarm 闹钟相关,为 AlarmManager 服务
硬件抽象层(HAL)
硬件抽象层,该层为硬件厂商定义了一套标准接口。有了这套标准接口之后,可以在不影响上层的情况下,调整内部实现。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,为了保护硬件厂商的知识产权,它隐藏了特定平台的硬件接口细节,为操作系统虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。从软硬件测试的角度来看,都可以分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成功可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。
系统运行库层 (Android Runtime 和 Native C/C++ Libraries)
系统运行库层分为两部分,分别是 C/C++ 程序库和 Android 运行时库,下面分别进行介绍。
1)C/C++ 程序库
C/C++ 程序库能被 Android 系统中的不同组件所使用,并通过应用框架层为开发者提供服务,主要的 C/C++ 程序库如下:
- OpenGL ES: 3D 绘图库
- Libc: 从 BSD 继承来的标准 C 系统函数库,专门为基于嵌入式 Linux 的设备定制
- Media Framework: 多媒体库,支持多种常用的音频、视频格式录制和回放
- SQLite: 轻型的关系型数据库引擎
- SGL: 底层的 2G 图形渲染引擎
- SSL: 安全套接层,是一种为网络通信提供安全及数据完整性的安全协议
- FreeType: 可移植的字体引擎,它提供统一的接口来访问多种字体格式文件
2)Android 运行时库
运行时库又分为核心库 (Core Libraries) 和 ART (Android 系统 5.0 之后,Dalvik 虚拟机被 ART 取代)。
核心库提供了 Java 语言核心库的大多数功能,这样开发者可以使用 Java 语言来编写 Android 应用。
与 JVM 相比,Dalvik 虚拟机 (DVM) 是专门为移动设备定制的,允许在有限内存中同时运行多个虚拟机的实例,并且每一个 Dalvik 应用被作为一个独立的 Linux 进程执行。而且独立的进程可以防止在虚拟机崩溃的时候所有程序被关闭。
替代 DVM 的 ART 的机制与 DVM 又有不同,DVM 中的应用每次运行时,字节码都需要通过即时编译器 (Just In Time, JIT) 转换为机器码,这会使得应用运行效率降低。而在 ART 中,系统在安装应用时会进行一次预编译 (Ahead Of Time, AOT) 将字节码预先编译成机器码并存储在本地,这样应用每一次运行的时候就不需要执行编译了,这样应用的运行效率也得到了大大的提高。
应用框架层 (Java API Framework)
Framework 层这一层包含了一系列重要的系统服务。对于 App 层的管理及 App 使用的 API 基本上都是在这一层提供的。这里面包含的服务很多,例如:
- AMS (ActivityManagerService): 包含所有应用组件的管理以及 App 进程管理
- WMS (WindowManagerService): 负责窗口管理
- PMS (PackageManagerService): 负责 APK 包的管理(安装、卸载、更新等)
- NMS (NotificationManagerService): 负责通知管理
- PMS (PowerManagerService): 电源管理
- LMS (LocationManagerService): 定位相关
- ……
应用层 (System Apps)
系统内置的应用程序与非系统级的应用程序都属于应用层,负责与用户进行直接交互,通常都是用 Java 进行开发的。