Android内核工程实践:从编译环境到设备启动 - 第1节

1.1 AOSP 架构全景

Android 开源项目(AOSP)是一个完整的移动设备软件栈,从底层 Linux 内核到上层应用框架均开源。理解 AOSP 架构是进行内核工程实践的前提。整个系统采用分层设计,各层职责清晰,通过明确定义的接口进行通信。

核心认知:AOSP 不是单一的操作系统,而是一个包含操作系统、中间件、关键应用和 SDK 的完整软件栈。内核位于最底层,是硬件与上层软件之间的桥梁。

1.1.1 五层架构模型

AOSP 官方将系统划分为五层,从底向上依次为:

层级 名称 核心组件 开发语言
第5层 应用层 系统应用(Launcher、Settings、Phone)、第三方应用 Java / Kotlin
第4层 应用框架层(Java API Framework) Activity Manager、Window Manager、Content Providers、View System Java
第3层 系统运行层(Android Runtime & Native C/C++ Libraries) ART、libc、WebKit、OpenGL ES、SQLite C/C++ / Java(ART)
第2层 硬件抽象层(HAL) Camera HAL、Audio HAL、Sensor HAL、GPS HAL C/C++
第1层 Linux 内核层 进程调度、内存管理、驱动(Binder、ashmem、ion)、电源管理 C / 汇编
工程视角:内核工程师主要关注第1层和第2层的交互。HAL 是内核驱动与上层框架之间的标准化接口,理解 HAL 的设计模式有助于编写更稳定的内核驱动。

1.1.2 AOSP 架构分层关系图

下图展示了 AOSP 各层之间的依赖与通信关系,重点关注内核层如何通过 HAL 向上提供服务:

AOSP 五层架构与内核位置 AOSP 五层软件架构与内核位置 第5层:应用层 系统应用 · 第三方应用 · Launcher · Settings 第4层:应用框架层 (Java API Framework) Activity Manager · Window Manager · Content Providers 第3层:系统运行层 ART 运行时 · libc · WebKit · OpenGL ES · SQLite 第2层:硬件抽象层 (HAL) Camera HAL · Audio HAL · Sensor HAL · GPS HAL 第1层:Linux 内核层 ★ 本课程核心 进程调度 · 内存管理 · Binder驱动 · ashmem · ion · 电源管理 硬件设备(CPU · GPU · 内存 · 传感器 · 摄像头 · 显示屏) 本课程重点
架构要点:内核层与 HAL 层之间的接口是 Linux 设备驱动模型。HAL 通过 open()、ioctl() 等标准系统调用与内核驱动交互。内核工程师需要确保驱动接口的稳定性和性能。

1.2 内核在 Android 系统中的位置与作用

Linux 内核是 AOSP 的基石。Google 在标准 Linux 内核基础上进行了大量 Android 专用增强,形成了 Android Common Kernel(ACK)。内核在 Android 系统中承担以下核心职责:

  • 硬件抽象与驱动管理:为显示屏、触摸屏、Wi-Fi、蓝牙、摄像头、传感器等硬件提供统一驱动框架。
  • 进程与内存管理:基于 Linux 的进程调度器(CFS)和内存管理子系统(MM),支撑 Android 的进程生命周期和内存回收机制(Low Memory Killer)。
  • 进程间通信(IPC):提供 Binder 驱动,这是 Android 特有的 IPC 机制,支撑 Service Manager、Intent 传递等核心功能。
  • 电源管理:实现 wake lock 和 suspend/resume 机制,平衡性能与功耗。
  • 安全与权限:基于 Linux 的 DAC(自主访问控制)和 SELinux(强制访问控制),提供应用沙箱隔离。

1.2.1 内核与 Android 专用增强

Android 内核并非标准 Linux 内核的直接移植。下表列出了 Android 对 Linux 内核的关键增强:

增强特性 所属子系统 作用描述
Binder 驱动 IPC 提供高性能、低延迟的进程间通信,支持 Service 绑定和跨进程调用
ashmem 内存管理 匿名共享内存,用于进程间高效共享数据(如 SurfaceFlinger 的图形缓冲区)
ion 内存管理 统一内存分配器,替代 PMEM,支持连续/非连续物理内存分配
Low Memory Killer (LMK) 内存管理 根据内存压力等级主动杀死低优先级进程,替代标准 Linux 的 OOM killer
Wake Lock 电源管理 允许应用阻止系统进入休眠状态,用于后台任务(如音乐播放)
SELinux 增强 安全 Android 4.3 起强制启用,提供细粒度的强制访问控制策略
重要提示:Android 内核与主线 Linux 内核的代码差异很大。直接使用主线内核无法启动 Android 系统,必须合入 Android 专用补丁(如 Binder、ashmem、ion)。本课程后续章节将详细讲解如何为内核打 Android 补丁。

1.2.2 内核在 Android 启动流程中的位置

Android 设备的启动流程清晰地展示了内核的核心地位。从 Boot ROM 到 init 进程,内核是硬件初始化和系统启动的关键枢纽:

Android 启动流程中的内核位置 Android 启动流程:内核是硬件初始化的核心 Boot ROM 固化引导代码 Bootloader 加载内核镜像 ★ Linux 内核 硬件初始化 · 驱动加载 init 进程 解析 init.rc Zygote 孵化应用进程 内核在启动流程中的关键职责 1. 初始化 CPU、内存控制器、中断控制器等核心硬件 2. 挂载根文件系统(ramdisk),加载必要驱动(如存储、显示) 3. 启动第一个用户空间进程 init(PID=1),移交控制权 4. 提供系统调用接口,支撑后续所有用户空间服务
工程要点:内核启动完成后,会执行 /init 可执行文件(即 init 进程)。init 进程解析 init.rc 脚本,启动 Service Manager、SurfaceFlinger、Zygote 等关键系统服务。如果内核崩溃(Kernel Panic),整个系统将无法启动。

1.3 AOSP 源码获取方式

获取 AOSP 源码是进行内核工程实践的第一步。由于 AOSP 代码库庞大(约 80GB+),Google 提供了专门的工具 repo 来管理多个 Git 仓库。以下是标准的源码获取流程:

1.3.1 环境准备

在开始下载前,需要确保开发环境满足以下要求:

  • 操作系统:Ubuntu 18.04 / 20.04 / 22.04 LTS(64位),或 macOS 10.15+
  • 磁盘空间:至少 250GB 空闲空间(建议 400GB+)
  • 内存:至少 16GB RAM(推荐 32GB+)
  • 网络:稳定的宽带连接,支持 Git 协议
  • 工具链:Git 2.19+、Python 3.6+、curl、OpenJDK(不同版本要求不同)

1.3.2 安装 repo 工具

repo 是 Google 基于 Python 开发的 Git 仓库管理工具。安装方式如下:

# 创建 bin 目录并加入 PATH
mkdir -p ~/bin
export PATH=~/bin:$PATH

# 下载 repo 工具
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

# 赋予执行权限
chmod a+x ~/bin/repo

# 验证安装
repo --version
国内加速:如果无法访问 Google 存储服务器,可以使用清华镜像源或中科大镜像源下载 repo 工具。例如:curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo。

1.3.3 初始化并同步 AOSP 源码

以下步骤以 Android 14(API 34)为例,展示完整的源码获取流程:

# 1. 创建工作目录
mkdir ~/aosp
cd ~/aosp

# 2. 初始化 repo 仓库(指定 Android 14 分支)
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1

# 3. 同步全部源码(耗时数小时,取决于网络速度)
repo sync -j4 -c

# 4. (可选)仅同步内核源码,节省时间
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1
repo sync kernel/

1.3.4 源码目录结构概览

同步完成后,AOSP 根目录包含以下关键子目录:

目录名 内容说明 本课程关注度
kernel/ Android Common Kernel 源码(包含所有 Android 专用补丁) ★★★★★
device/ 各厂商设备配置、BoardConfig、内核编译脚本 ★★★★☆
hardware/ HAL 实现、硬件抽象层接口定义 ★★★★☆
system/ 核心系统服务(init、adbd、logd) ★★★☆☆
frameworks/ 应用框架层(Activity Manager、Window Manager) ★★☆☆☆
external/ 第三方开源库(libpng、zlib、sqlite) ★★☆☆☆
prebuilts/ 预编译工具链(gcc、clang、JDK) ★★★☆☆
build/ 编译系统(Soong、Makefile、Blueprint) ★★★★☆
磁盘空间警告:完整同步 AOSP 源码(含所有 Git 历史)约占用 80-120GB 空间。如果仅进行内核开发,建议只同步 kernel/ 和 device/ 目录,可节省 70% 以上的空间。后续章节将介绍如何单独编译内核。

1.3.5 使用镜像源加速下载

对于中国大陆开发者,推荐使用以下镜像源替代 Google 官方源:

镜像源 repo init 命令 特点
清华大学 TUNA repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r1 同步速度快,更新及时
中国科学技术大学 USTC repo init -u https://git.ustc.edu.cn/aosp/platform/manifest -b android-14.0.0_r1 稳定性好,支持 HTTP/2
腾讯云镜像 repo init -u https://mirrors.cloud.tencent.com/aosp/platform/manifest -b android-14.0.0_r1 国内 CDN 加速,下载速度快
最佳实践:建议首次同步时使用 repo sync -j4(4 个并行任务),避免网络拥塞。如果同步中断,重新执行 repo sync 会断点续传,不会从头开始。同步完成后,可以执行 repo status 检查各仓库状态。

1.3.6 内核源码分支选择

Android 内核源码有多个分支,对应不同的内核版本和设备类型。选择正确的分支是内核开发的第一步:

内核分支 Linux 内核版本 适用 Android 版本 典型设备
android-4.14-stable 4.14.x Android 9 ~ 11 Pixel 2/3、骁龙 845 平台
android-4.19-stable 4.19.x Android 10 ~ 12 Pixel 4、骁龙 865 平台
android-5.10-stable 5.10.x Android 12 ~ 13 Pixel 6、Tensor 芯片
android-5.15-stable 5.15.x Android 13 ~ 14 Pixel 7/8、骁龙 8 Gen 2
android-6.1-stable 6.1.x Android 14+ 最新 Pixel 设备