这篇是五层架构,比上篇《Android 工具之系统四层体系结构详解》四层架构多出HAL层;
从下图中可以很清楚得看出,整个架构可以分为五大层次:
- System Apps:即
系统应用层
,这一层中都是我们使用手机时都会直接接触到的各种应用。 - Java API Framework:即 Java
接口框架层
,这一层是为了上层应用提供各种接口。 - Native C/C++ Libraries && Android Runtime:分别是
原生 C/C++ 库
,安卓运行时环境
。这一层中,C/C++ 库集成了许多诸如OpenGL ES
这样的开源库,提供了很多封装好的方法。而运行时环境则是与一些核心库、Dalvik Virtual Machine
相关的东西,这方面暂时还没多少了解。 - HAL(Hardware Abstract Layer):这是一个
硬件抽象层
,它主要是在 Framework 层和 Linux Kernel 层之间起到一个链接作用。 - Linux Kernel:即
Linux 内核层
,整个 Android 系统实际上是基于 Linux 的内核搭建起来的。
- 系统应用层
- 它包含了一系列使用
Java
编写的核心程序包(Home,Phone,Browser...)
。 - 应用程序通过调用框架层的接口,或者
JNI (Java 原生接口)
来完成自己的业务逻辑。 - 值得注意的是,要使用
JNI
开发原生应用程序,需要与Android NDK
配合,NDK
使得Java
可以与C/C++
进行交互。
- 它包含了一系列使用
- Java 接口框架层
- 也有人称为应用程序框架层,实际上这一层主要是提供给上层应用一些访问核心功能的
API
框架。 - 框架是应用程序的核心,也是开发者需要共同遵守的一个约定,大家可以在这个约定的基础之上进行一些必要的扩展,但是主体结构需要保持一致。
- 框架层提供了大量的接口,当需要使用到某些接口的时候,可以去看看它对应的官方文档:
- 也有人称为应用程序框架层,实际上这一层主要是提供给上层应用一些访问核心功能的
- C/C++ 库 && Android 运行时环境
- 官方 API不是万能的,开发者常常需要自己一些
API
以实现自己的业务逻辑,这时候我们就可以通过调用C/C++ 本地库
的接口来进行个性化设计。 - 需要注意的是,这些
C/C++库
(第三方库)是独立于Android 系统架构
实现的,但是它与系统架构处于相同的地位:- 他们都使用
Linux 内核层
提供服务,实现、封装模块,以供应用层调用。
- 他们都使用
- 运行时环境提供了一些核心链接库。
- 以及
Dalvik
虚拟机:DVM
代替了JVM
,“.java”
文件编译为“.class”
文件后,再编译得到“.dex”
程序,最后又打包成为 Android 可执行文件“.apk”
。- 每个应用都运行在自己的进程上(一个应用程序对应一个虚拟机,一一对应关系),而
DVM
为它分配自有实例。 Dalvik
的好处是,使得一台设备可以运行多个虚拟机程序,并且消耗比较少的资源。
- 官方 API不是万能的,开发者常常需要自己一些
- HAL(Hardware Abstract Layer)硬件抽象层,主要是在 Framework 层和 Linux Kernel 层之间起到一个链接作用
- 向下屏蔽了硬件驱动模块的实现细节,并向上提供硬件访问服务。
- 这一层的存在,实际上主要是为了保护移动设备厂商的商业利益:
-
Linux 内核源码遵循 GPL 协议,基于它所修改的源码需要完全公开,如果设备厂商通过修改内核源码来提供服务,就需要公开对应的代码,这就暴露了很多硬件相关的参数和实现的细节。
-
为了保证商业利益,在 Android 架构中提供一个硬件抽象层给设备厂商对硬件做出具体实现,而 Linux 内核仅提供简单的硬件访问通道。由于 Android 源码遵循商业友好的Apache License 协议,这样设备厂商的利益就得到了保障。
-
Windows NT内核的操作系统一个目标是使操作系统可跨平台移植。HAL服务包括对设备寄存器的访问、总线独立的设备寻址、中断处理和复位、DMA传输、定时器和实时时钟的控制、底层的自旋锁(Spin Lock)和多处理机同步、BIOS接口以及CMOS配置内存。HAL提供了一个服务,该服务通过将总线相连的设备地址映射到系统范围内的逻辑地址来识别设备。HAL提供了一些原子方法来管理这种同步,如自旋锁——一个CPU仅仅等待一个由其他CPU占用的系统资源被释放,尤其是在资源只被几条机器指令所占用的情况下。
-
- Linux 内核层
- Android 是基于
Linux 内核
开发的(官方给出的例子是,Android Runtime (ART)
依靠 Linux 内核来执行底层功能,例如线程和底层内存管理
)。 - 一个很重要的部分是
Linux 内核驱动
部分,在Camera 流程
中,我们的控制指令最终要通过内核驱动发送给Camera 设备
,同时也要通过它对设备返回的数据向上传输。 - 在 Android 中,增加了
YAFFS2(Yet Another Flash File System, 2nd edition)
文件系统。 - 增加了一个进程间通信的机制
IPC Binder
,通过Binder
,可以使不同进程可以访问同一块共享内存。Binder 机制在整个 Camera 流程中起到了十分重要的作用,它主要使用在CameraClient
与CameraServer
的交互中(主要是camera2)。
- Android 是基于
参考链接: