Android内核驱动开发基础 - 第1节
1.1 Android 软件栈全景
Android 系统采用分层架构设计,从上到下依次为 应用层、应用框架层、运行时与系统库层 以及 Linux 内核层。每一层都为其上层提供明确的抽象接口,下层对上层透明。这种分层结构使得系统各模块职责清晰、可独立演进,同时也为内核驱动开发划定了明确的边界。
核心观点: 内核层是 Android 系统的“地基”,所有上层功能最终都要通过内核与硬件交互。驱动开发者的工作主要集中在内核层及其与上层的接口。
1.1.1 四层架构职责速览
| 层次 | 主要组件 | 核心职责 |
|---|---|---|
| 应用层 | 系统应用(电话、设置)、第三方 App | 用户直接交互的界面与业务逻辑 |
| 应用框架层 | Activity Manager、Window Manager、Content Providers | 提供 App 开发所需的 Java API 与服务 |
| 运行时与系统库层 | ART、Native 库(libc、WebView)、HAL | 应用执行环境、核心 C/C++ 库、硬件抽象 |
| Linux 内核层 | 进程调度、内存管理、驱动模型、Binder 驱动 | 硬件抽象、资源管理、安全隔离 |
1.1.2 Android 软件栈分层架构图
下图展示了 Android 系统的四层结构以及各层之间的典型调用路径。注意内核层与硬件之间的直接交互关系。
1.2 各层详细解读
1.2.1 应用层
应用层是用户直接接触的层面,包含 Android 系统预装应用(如电话、短信、设置)以及用户安装的第三方应用。应用层使用 Java/Kotlin 语言开发,运行在 ART 虚拟机之上。应用通过调用框架层提供的 API 来实现功能,不直接与内核交互。
1.2.2 应用框架层
应用框架层为应用开发提供了一整套 Java API 和服务,是开发者最常接触的层面。关键组件包括:
- Activity Manager: 管理应用的生命周期和任务栈。
- Window Manager: 负责窗口的创建、布局和显示。
- Content Providers: 实现跨应用的数据共享。
- View System: 提供 UI 组件的构建基础。
- Package Manager: 管理应用的安装、卸载和权限。
1.2.3 运行时与系统库层
该层包含两个关键部分:
- ART 运行时: Android 4.4 引入、5.0 正式取代 Dalvik 的运行时环境。ART 在应用安装时进行预编译(AOT),显著提升执行效率。它负责 Dex 字节码的翻译、内存分配与垃圾回收。
- Native 系统库: 使用 C/C++ 编写,通过 JNI 被框架层调用。包括 libc (Bionic)、WebView、Media Framework、OpenGL ES 等。
- HAL (硬件抽象层): 位于系统库与内核之间,定义了标准接口,使得上层无需关心具体硬件实现。HAL 是驱动开发者需要重点关注的上层接口。
驱动开发者提示: HAL 层是连接内核驱动与 Android 框架的桥梁。编写内核驱动后,通常需要编写对应的 HAL 模块,才能被上层服务调用。
1.3 内核层的作用与地位
Linux 内核层是 Android 系统的核心与基石。Android 基于 Linux 长期支持 (LTS) 内核版本,并在此基础上增加了 Android 特有的增强功能。内核层承担着以下关键职责:
- 硬件抽象与驱动管理: 内核通过设备驱动程序直接与硬件通信,为上层提供统一的文件操作接口(open/read/write/ioctl)。
- 进程与线程调度: 管理所有用户态和内核态任务的执行,采用 CFS 调度器确保公平性与实时性。
- 内存管理: 负责虚拟内存、物理内存分配、内存映射以及 LMK (Low Memory Killer) 机制。
- 安全与权限: 基于 Linux 的用户/用户组模型,结合 SELinux 强制访问控制,实现应用隔离与系统安全。
- 进程间通信 (IPC): Android 特有的 Binder 驱动运行在内核空间,提供高效、安全的跨进程通信能力。
- 电源管理: 包括 wakelock、suspend/resume 机制,是移动设备续航的关键。
1.3.1 内核层在 Android 系统中的核心地位
下图展示了内核层如何作为“中间层”连接硬件与上层软件栈,以及 Android 特有的内核增强组件。
1.4 Android 内核与标准 Linux 内核的差异
Android 内核基于标准 Linux 内核,但为了适应移动设备和 Android 生态,加入了一系列特有功能:
| 特性 | 标准 Linux 内核 | Android 内核 |
|---|---|---|
| IPC 机制 | D-Bus、Socket、Pipe | Binder(Android 核心 IPC,运行在内核空间) |
| 电源管理 | 标准 suspend/resume | Wakelock + 早期 suspend(已逐步向主线靠拢) |
| 内存管理 | OOM Killer | LMK (Low Memory Killer) / 新版 LMKD |
| 用户空间 HAL | 直接访问 /dev 节点 | HAL + Treble(接口标准化,驱动与框架解耦) |
| 显示系统 | DRM/FB 原生 | HWC (Hardware Composer) + SurfaceFlinger |
| 安全模型 | DAC (传统 Linux 权限) | SELinux 强制模式 + 应用沙箱 |
开发注意: 在编写 Android 内核驱动时,必须考虑 Binder 驱动的存在以及 SELinux 策略。驱动设备节点的访问权限需要通过 SELinux 策略文件显式声明,否则即使文件权限正确,上层应用也无法访问。
1.5 内核驱动开发者的工作边界
作为 Android 内核驱动开发者,你的工作主要集中在以下三个层面:
- 内核空间: 编写/移植设备驱动(字符设备、平台驱动、I2C/SPI 总线驱动等),实现 file_operations 接口。
- HAL 层: 编写对应硬件的 HAL 模块,将内核驱动的接口封装成上层可调用的标准函数。
- 系统集成: 配置 DTS (Device Tree)、编写 SELinux 策略、处理内核与 HAL 之间的数据传递。