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 系统的四层结构以及各层之间的典型调用路径。注意内核层与硬件之间的直接交互关系。

Android 软件栈分层架构 应用层 (Application Layer) 系统应用 · 第三方 App · 桌面 Launcher 应用框架层 (Application Framework) Activity Manager · Window Manager · Content Providers · View System 运行时与系统库层 ART 运行时 · Native 库 (libc, WebView) · HAL 硬件抽象层 Linux 内核层 (Linux Kernel) 进程调度 · 内存管理 · 驱动模型 · Binder 驱动 · 电源管理 硬件 (CPU, GPU, 传感器, 存储, 网络) 驱动 开发 核心区

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 特有的增强功能。内核层承担着以下关键职责:

  1. 硬件抽象与驱动管理: 内核通过设备驱动程序直接与硬件通信,为上层提供统一的文件操作接口(open/read/write/ioctl)。
  2. 进程与线程调度: 管理所有用户态和内核态任务的执行,采用 CFS 调度器确保公平性与实时性。
  3. 内存管理: 负责虚拟内存、物理内存分配、内存映射以及 LMK (Low Memory Killer) 机制。
  4. 安全与权限: 基于 Linux 的用户/用户组模型,结合 SELinux 强制访问控制,实现应用隔离与系统安全。
  5. 进程间通信 (IPC): Android 特有的 Binder 驱动运行在内核空间,提供高效、安全的跨进程通信能力。
  6. 电源管理: 包括 wakelock、suspend/resume 机制,是移动设备续航的关键。

1.3.1 内核层在 Android 系统中的核心地位

下图展示了内核层如何作为“中间层”连接硬件与上层软件栈,以及 Android 特有的内核增强组件。

内核层核心地位与组件 HAL / 系统库 / 框架层 Linux 内核层 (Android 通用内核) 进程调度 内存管理 Binder 驱动 设备驱动模型 电源管理 SELinux 网络协议栈 文件系统 硬件 (CPU/GPU/传感器/存储/显示) Android 特有 增强 (AOSP 通用 内核)

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 之间的数据传递。