在 Android ROM 开发、嵌入式开发、Linux 驱动开发中,经常会遇到这些概念:

固件 Firmware
驱动 Driver
HAL
BSP
Bootloader
Kernel
Device Tree
Framework
SDK / NDK

这些概念都和“硬件如何被系统使用”有关,但它们所在层级和职责不同。


一、整体层级关系

可以先从一张图理解:

App 应用层
    ↓
Android Framework
    ↓
System Service
    ↓
HAL 硬件抽象层
    ↓
Kernel Driver 内核驱动
    ↓
Firmware 固件
    ↓
Hardware 硬件

如果再加上启动流程,大概是:

BootROM
   ↓
Bootloader
   ↓
Linux Kernel
   ↓
Driver
   ↓
HAL
   ↓
Android Framework
   ↓
App

二、固件 Firmware

1. 什么是固件?

固件是运行在设备或硬件模块中的底层软件。

它通常和硬件绑定很紧,负责让硬件具备基本工作能力。

常见例子:

BIOS / UEFI
路由器系统
手机 ROM 包
Wi-Fi 芯片固件
蓝牙芯片固件
Modem 固件
触摸 IC 固件
摄像头模组固件
MCU 程序

2. 固件的特点

比普通 App 更底层
通常存储在 Flash / ROM / eMMC / SPI Flash 中
和具体硬件强相关
升级固件通常叫“刷固件”

3. 广义固件和狭义固件

广义上:

设备中的底层系统镜像也可以叫固件

例如:

手机刷机包
路由器系统包
Android ROM 包

狭义上:

运行在某个硬件模块内部的小程序才叫固件

例如:

Wi-Fi 芯片内部固件
蓝牙芯片内部固件
触摸 IC 固件
Modem 固件

三、驱动 Driver

1. 什么是驱动?

驱动是操作系统中用来控制硬件的代码。

它通常运行在 Linux Kernel 中,负责和具体硬件打交道。

常见驱动:

屏幕驱动
触摸驱动
摄像头驱动
音频驱动
Wi-Fi 驱动
蓝牙驱动
USB 驱动
电池驱动
充电 IC 驱动
指纹驱动
传感器驱动

2. 驱动的作用

驱动的作用是:

把硬件能力封装成操作系统可以使用的接口

例如触摸屏:

手指触摸屏幕
   ↓
触摸 IC 产生中断
   ↓
Linux 触摸驱动读取坐标
   ↓
Input 子系统上报事件
   ↓
Android Framework 处理输入事件
   ↓
App 收到 MotionEvent

没有驱动,系统就不知道如何使用硬件。


四、HAL

1. 什么是 HAL?

HAL 全称:

Hardware Abstraction Layer
硬件抽象层

一句话解释:

HAL 是 Android Framework 和底层驱动之间的标准接口层。

它不是驱动,而是对底层硬件能力的抽象封装。


2. HAL 所在位置

App
 ↓
Android Framework
 ↓
System Service
 ↓
HAL
 ↓
Kernel Driver
 ↓
Firmware
 ↓
Hardware

比如相机:

相机 App
 ↓
Camera Framework / CameraService
 ↓
Camera HAL
 ↓
Kernel Camera Driver
 ↓
Camera Sensor Firmware
 ↓
摄像头硬件

3. HAL 的作用

HAL 的核心作用是:

屏蔽硬件差异,让 Android Framework 用统一方式访问不同硬件。

比如不同手机可能使用不同摄像头模组:

索尼 Sensor
三星 Sensor
豪威 Sensor
不同 ISP
不同对焦马达
不同闪光灯

但 Android Framework 不可能为每一种硬件写一套逻辑。

所以 Android 规定一套标准 HAL 接口,厂商负责实现。

Framework 只调用标准接口,不关心底层硬件具体怎么实现。


4. HAL 和 Driver 的区别

对比项

HAL

Driver

中文名

硬件抽象层

驱动

所在层级

用户空间 / Vendor 层

Kernel 层

面向对象

Android Framework

具体硬件

主要作用

提供统一硬件接口

直接控制硬件

是否直接操作寄存器

通常不直接

通常会

举例

Camera HAL、Audio HAL

Camera Driver、Audio Driver

可以这样记:

Driver:解决“硬件怎么操作”
HAL:解决“Android 怎么统一调用”

五、Firmware、Driver、HAL 的关系

以 Wi-Fi 为例:

Settings / App
   ↓
Wi-Fi Framework
   ↓
Wi-Fi HAL
   ↓
Wi-Fi Driver
   ↓
Wi-Fi Firmware
   ↓
Wi-Fi 芯片

对应职责:

Wi-Fi HAL:
给 Android Framework 提供统一接口

Wi-Fi Driver:
运行在 Linux Kernel 中,负责控制 Wi-Fi 芯片

Wi-Fi Firmware:
运行在 Wi-Fi 芯片内部,负责芯片自身逻辑

Wi-Fi Hardware:
真正的物理硬件

所以它们不是一个东西,而是不同层级的协作关系。


六、BSP

1. 什么是 BSP?

BSP 全称:

Board Support Package
板级支持包 / 板级开发支持包

BSP 不是单个程序,而是一整套底层适配包。

它的目标是:

让操作系统能在某一块具体硬件板子上跑起来。

2. BSP 通常包含什么?

一套 Android BSP 可能包含:

Bootloader
Linux Kernel
设备树 Device Tree
各种硬件驱动
HAL 层代码
固件文件
分区表
init 配置
sepolicy
BoardConfig 配置
编译脚本
烧录工具
测试工具
开发文档

可以理解成:

BSP 是一个大礼包
里面可能包含 Driver、HAL、Firmware、Kernel、Bootloader 等内容

3. BSP、Driver、HAL、Firmware 的关系

BSP
 ├── Bootloader
 ├── Kernel
 │    ├── 显示驱动
 │    ├── 触摸驱动
 │    ├── 摄像头驱动
 │    ├── 音频驱动
 │    └── Wi-Fi 驱动
 ├── Device Tree
 ├── HAL
 ├── Firmware
 ├── init 配置
 ├── sepolicy
 ├── 编译配置
 └── 烧录工具

所以:

BSP 是最大集合
Driver 是 BSP 的一部分
HAL 也是 BSP 的一部分
Firmware 也可能包含在 BSP 中

七、Bootloader

1. 什么是 Bootloader?

Bootloader 是启动加载器。

它负责在设备上电后,初始化基本硬件环境,然后加载操作系统内核。

启动过程大概是:

上电
 ↓
BootROM
 ↓
Bootloader
 ↓
Linux Kernel
 ↓
Android 系统

常见 Bootloader:

U-Boot
LK
ABL
UEFI

2. Bootloader 的作用

初始化内存
初始化存储
加载 Kernel
加载 Device Tree
校验启动镜像
进入 fastboot / recovery / 正常启动模式

八、BootROM

BootROM 是芯片内部固化的第一段启动代码。

它通常由芯片厂商写入芯片内部,用户一般不能修改。

它的作用是:

芯片上电后最先执行
初始化最基本环境
寻找 Bootloader
支持烧录模式 / 救砖模式

启动链路可以理解为:

BootROM 是第一个启动者
Bootloader 是第二阶段启动者
Kernel 是操作系统核心
Android 是上层系统

九、Kernel

1. 什么是 Kernel?

Kernel 是操作系统内核。

Android 底层使用的是 Linux Kernel。

Kernel 负责:

进程调度
内存管理
文件系统
网络协议栈
驱动模型
电源管理
权限和安全机制

2. Driver 和 Kernel 的关系

很多硬件驱动都运行在 Kernel 中。

例如:

触摸驱动
显示驱动
音频驱动
USB 驱动
电池驱动
摄像头部分驱动

所以可以简单理解:

Kernel 是操作系统核心
Driver 是 Kernel 中控制硬件的一部分代码

十、Device Tree

1. 什么是 Device Tree?

Device Tree,中文叫设备树。

常见文件:

.dts
.dtsi
.dtb
.dtbo

它的作用是描述硬件连接信息。

例如:

这块板子用了哪个屏幕
I2C 地址是多少
GPIO 引脚怎么接
中断号是多少
电源时序是什么
摄像头接在哪个 MIPI 接口
触摸屏复位脚是哪一个

2. Driver 和 Device Tree 的区别

Driver:告诉系统“怎么操作这个硬件”
Device Tree:告诉系统“这个硬件在哪里、参数是什么”

举例:

触摸驱动代码:
负责读坐标、处理中断、上报 input 事件

设备树:
描述触摸 IC 的 I2C 地址、中断 GPIO、复位 GPIO、电源配置

十一、Framework

Android Framework 是 Android 系统为 App 提供的上层 API 和系统服务。

常见 Framework 能力:

ActivityManager
WindowManager
PackageManager
CameraManager
AudioManager
WifiManager
SensorManager
LocationManager

Framework 通常不会直接操作硬件,而是通过 System Service 调用 HAL,再由 HAL 调用 Driver。

例如音频播放:

音乐 App
 ↓
MediaPlayer / AudioTrack
 ↓
AudioFlinger
 ↓
Audio HAL
 ↓
ALSA / Kernel Audio Driver
 ↓
Codec / Speaker

十二、SDK 和 NDK

1. SDK

SDK 全称:

Software Development Kit
软件开发工具包

Android SDK 面向应用开发者,提供:

Android API
编译工具
调试工具
模拟器
文档
Gradle 插件相关工具

SDK 更偏上层应用开发。


2. NDK

NDK 全称:

Native Development Kit

Android NDK 用于开发 C / C++ native 代码。

常见场景:

音视频
游戏引擎
OpenGL
图像处理
算法库
加密库
JNI
跨平台 C/C++ 库

NDK 不是驱动开发工具。

它主要服务于 App 的 Native 层开发。


十三、HIDL 和 AIDL

1. 它们和 HAL 的关系

HAL 是硬件抽象层的概念。

HIDL / AIDL 是定义 HAL 接口的方式。

可以理解为:

HAL:我要抽象硬件接口
HIDL / AIDL:用什么语言和规范来定义这些接口

2. HIDL

HIDL 全称:

HAL Interface Definition Language

它是 Android 为 HAL 设计的一套接口定义语言。

Android 8.0 Treble 之后,大量 HAL 使用 HIDL 方式定义接口。


3. AIDL HAL

AIDL 全称:

Android Interface Definition Language

AIDL 原本常用于 Android Binder 跨进程通信,后来也被用于定义 HAL 接口。

现代 Android 更推荐使用 AIDL HAL。

大概演进关系:

Legacy HAL
   ↓
HIDL HAL
   ↓
AIDL HAL

十四、Legacy HAL 和 Binderized HAL

1. Legacy HAL

早期 HAL 经常以动态库形式存在。

大概调用方式:

System Service
   ↓ dlopen
HAL .so
   ↓
Kernel Driver

特点是系统进程直接加载 HAL 动态库,耦合较重。


2. Binderized HAL

Android Treble 之后,很多 HAL 变成独立服务,通过 Binder 和 Framework 通信。

大概结构:

System Service
   ↓ Binder IPC
HAL Service
   ↓
Kernel Driver

优点:

Framework 和 Vendor 解耦
系统升级更方便
HAL 崩溃不一定拖垮 system_server
接口版本更清晰
权限隔离更好
SELinux 管理更清晰

十五、用 Android 手机举例

假设厂商要开发一台 Android 平板,芯片厂通常会提供一套 BSP:

Android BSP
 ├── Bootloader
 ├── Linux Kernel
 ├── 屏幕驱动
 ├── 触摸驱动
 ├── Camera 驱动
 ├── Audio 驱动
 ├── Wi-Fi / BT 驱动
 ├── Camera HAL
 ├── Audio HAL
 ├── Sensor HAL
 ├── Power HAL
 ├── Device Tree
 ├── init.rc
 ├── sepolicy
 ├── BoardConfig.mk
 ├── 固件文件
 └── 烧录工具

设备厂商在这套 BSP 基础上进行适配:

换屏幕
换触摸 IC
换摄像头模组
换电池
改按键
改分区
改开机动画
适配传感器
调试功耗
调试音频
调试相机效果

最终生成可以烧录的系统镜像:

boot.img
vendor.img
system.img
dtbo.img
vbmeta.img
super.img

这些镜像整体也经常被称为:

ROM 包
固件包
刷机包
系统镜像

十六、几个概念的对比表

概念

中文名

所在层级

作用

Firmware

固件

硬件模块内部或底层存储

让硬件具备基础能力

Driver

驱动

Kernel 层

控制具体硬件

HAL

硬件抽象层

用户空间 / Vendor 层

给 Framework 提供统一硬件接口

BSP

板级支持包

多层集合

让系统跑在某块具体板子上

Bootloader

启动加载器

Kernel 之前

初始化硬件并加载内核

BootROM

芯片固化启动代码

芯片内部

上电后最先执行

Kernel

内核

操作系统核心

管理进程、内存、驱动、文件系统

Device Tree

设备树

Kernel 配置数据

描述硬件连接和参数

Framework

框架层

Android 系统层

给 App 提供系统 API

SDK

软件开发工具包

应用开发层

给 App 开发者使用

NDK

Native 开发工具包

App Native 层

用 C/C++ 开发 Android native 代码


十七、最核心的记忆方式

可以这样记:

Firmware:硬件自己内部跑的程序
Driver:内核里控制硬件的代码
HAL:Android 对硬件能力的标准封装
Framework:给 App 提供系统 API
BSP:把 Bootloader、Kernel、Driver、HAL、Firmware、配置和工具打包起来

再简化一点:

Driver 负责“控制硬件”
HAL 负责“统一接口”
Firmware 负责“硬件内部逻辑”
BSP 负责“让整块板子跑起来”

十八、面试回答版本

如果面试官问:固件、驱动、HAL、BSP 有什么区别?

可以这样回答:

固件是运行在设备或硬件模块内部的底层程序,例如 Wi-Fi 固件、蓝牙固件、Modem 固件。驱动是操作系统内核中控制硬件的代码,例如触摸驱动、音频驱动、摄像头驱动。HAL 是 Android Framework 和底层驱动之间的硬件抽象层,它不是驱动,而是厂商按照 Android 标准实现的一组接口,用来屏蔽硬件差异。BSP 是板级支持包,是一个更大的集合,通常包含 Bootloader、Kernel、Driver、Device Tree、HAL、Firmware、编译配置和烧录工具,用来支持某块具体硬件板子运行操作系统。


十九、最终总结

这些概念可以按范围从小到大理解:

Firmware / Driver / HAL
        ↓
Kernel / Framework
        ↓
BSP

按运行链路理解:

App
 ↓
Framework
 ↓
HAL
 ↓
Driver
 ↓
Firmware
 ↓
Hardware

按启动链路理解:

BootROM
 ↓
Bootloader
 ↓
Kernel
 ↓
Android System

真正做 Android ROM 或嵌入式开发时,通常不是只改一个地方,而是会同时涉及:

设备树配置
内核驱动调试
HAL 适配
firmware 加载
init 启动配置
sepolicy 权限
系统镜像编译
烧录测试

所以这些概念最好不要孤立记,而是放到完整系统架构里理解。