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 向上提供服务:
架构要点:内核层与 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 进程,内核是硬件初始化和系统启动的关键枢纽:
工程要点:内核启动完成后,会执行
/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 设备 |