2. Android内核源码获取

Android驱动开发的第一步是获取正确的内核源码。与普通Linux内核开发不同,Android内核源码的获取涉及AOSP(Android Open Source Project)仓库管理、内核分支匹配以及repo工具的使用。本节将系统讲解从AOSP下载内核源码的完整流程,并重点分析内核分支的选择策略。

2.1 AOSP与内核源码的仓库结构

Android系统的源码由多个Git仓库组成,内核源码是其中的一个独立部分。AOSP使用repo工具来管理这些分散的仓库,实现多仓库的协同版本控制。

核心概念: AOSP内核源码并不直接存放在AOSP主仓库中,而是通过manifest文件引用独立的Linux内核Git仓库。每个Android版本对应一组特定的内核分支和提交。
AOSP内核源码仓库结构 AOSP主仓库 default.xml (Manifest) 内核Git仓库 vendor/xxx/驱动模块 android-4.14-q android-4.19-q android-5.10-xxx 说明: • Manifest文件定义了所有需要同步的Git仓库及其分支、提交ID。 • 内核仓库独立于AOSP主仓库,通过manifest中的标签引用。 • 每个Android版本(如Android 10/11/12)都有对应的内核分支。

2.2 repo工具:多仓库管理利器

repo是Google为AOSP开发的Python工具,用于简化多Git仓库的管理。它本质上是对Git命令的封装,通过Manifest文件实现批量操作。

2.2.1 repo的安装与初始化

# 1. 安装repo工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

# 2. 创建工作目录
mkdir ~/aosp-kernel
cd ~/aosp-kernel

# 3. 初始化repo(以Android 12内核为例)
repo init -u https://android.googlesource.com/kernel/manifest -b android-12.1.0_r27

# 4. 同步源码
repo sync -j8  # -j8表示8个并行任务
提示: repo sync 首次执行会下载大量数据(通常10GB以上),建议使用稳定的网络环境,并考虑使用国内镜像源加速。

2.2.2 repo常用命令速查

命令 功能 典型参数
repo init 初始化repo工作区,下载Manifest文件 -u <manifest-url> -b <branch>
repo sync 同步所有仓库到本地 -j<N> -c --no-tags
repo start 在所有仓库中创建新分支 <branch-name> --all
repo status 查看所有仓库的修改状态 无参数
repo diff 显示所有仓库的未提交差异 --cached
repo upload 将修改上传到Gerrit审核 --reviewer=<email>

2.3 内核分支选择策略

选择正确的内核分支是驱动开发的关键前提。Android内核分支命名遵循特定规则,反映了内核版本、Android版本和芯片平台信息。

2.3.1 分支命名规则

# 通用内核分支格式
android-<内核主版本>.<次版本>-<Android代号>[-<芯片厂商>]

# 示例
android-4.14-q          # 内核4.14 + Android 10 (Q)
android-4.19-q          # 内核4.19 + Android 10 (Q)
android-5.10-android12  # 内核5.10 + Android 12
android-msm-wahoo-4.4   # 高通MSM平台 + Pixel 2 (Wahoo) + 内核4.4

2.3.2 分支选择对照表

Android版本 API级别 推荐内核分支 内核版本 适用场景
Android 10 (Q) 29 android-4.14-q 4.14.x 主流设备,稳定性高
Android 11 (R) 30 android-4.19-stable 4.19.x 新功能支持,性能优化
Android 12 (S) 31 android-5.10-android12 5.10.x LTS内核,长期维护
Android 13 (T) 33 android-5.15-android13 5.15.x 最新特性,新硬件支持
Android 14 (U) 34 android-6.1-android14 6.1.x 前沿开发,新架构
重要警告: 内核分支必须与目标设备的Android版本严格匹配。例如,为Android 12设备编译的驱动模块,如果使用Android 10的内核分支,将导致加载失败或系统崩溃。务必通过 getprop ro.build.version.release 确认设备Android版本。

2.4 使用repo下载特定内核源码

以下是一个完整的实战流程,演示如何为Pixel 6设备(Android 12)下载对应的内核源码。

2.4.1 确定设备内核配置

# 在设备上执行,获取内核版本信息
adb shell cat /proc/version
# 输出示例:Linux version 5.10.43-android12-9-00042-g12345678

adb shell getprop ro.build.version.release
# 输出:12

adb shell getprop ro.board.platform
# 输出:gs101  (Google Tensor芯片)

2.4.2 下载内核源码

# 1. 创建专用工作目录
mkdir ~/kernel_pixel6
cd ~/kernel_pixel6

# 2. 初始化manifest(使用Android 12内核manifest)
repo init -u https://android.googlesource.com/kernel/manifest \
          -b android-12.1.0_r27 \
          -m kernel-5.10.xml

# 3. 查看manifest内容(确认包含的内核仓库)
cat .repo/manifest.xml | grep "kernel"

# 4. 同步内核源码(只同步内核相关仓库)
repo sync -j8 -c --no-tags

# 5. 切换到目标分支
cd common
git checkout android-5.10-android12

2.4.3 验证源码完整性

# 检查内核版本
cd common
make kernelversion
# 输出:5.10.43

# 查看已配置的defconfig
ls arch/arm64/configs/
# 输出:... gs101_defconfig ...
repo同步内核源码完整流程 步骤1:创建目录 mkdir ~/kernel_work 步骤2:repo init 指定manifest和分支 步骤3:repo sync 并行下载所有仓库 步骤4:切换分支 git checkout <branch> 步骤5:验证源码 make kernelversion 关键参数说明: • -j8:8个并行任务,根据CPU核心数调整(通常为CPU核心数×2) • -c:只同步当前分支,减少数据量 • --no-tags:不同步标签,节省带宽

2.5 使用国内镜像源加速下载

由于网络限制,直接从Google源码服务器下载可能非常缓慢。推荐使用国内镜像源,显著提升下载速度。

# 使用清华AOSP镜像
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/kernel/manifest \
          -b android-12.1.0_r27

# 或使用中科大镜像
repo init -u https://git.ustc.edu.cn/aosp/kernel/manifest \
          -b android-12.1.0_r27

# 同步时同样使用镜像
repo sync -j8 -c --no-tags
性能建议: 首次同步建议使用 -j4 避免网络拥塞,后续增量同步可使用 -j16 或更高。如果同步中断,重新执行 repo sync 会断点续传,不会重复下载已完成的部分。

2.6 内核源码目录结构解析

同步完成后,内核源码目录包含以下关键子目录和文件:

kernel_work/
├── common/                    # 通用内核源码(主要工作目录)
│   ├── arch/                  # 架构相关代码(arm64, x86等)
│   ├── drivers/               # 设备驱动目录
│   ├── include/               # 内核头文件
│   ├── kernel/                # 核心内核代码
│   ├── Makefile               # 顶层Makefile
│   └── Kconfig                # 内核配置菜单
├── private/                   # 厂商私有模块
│   └── google-modules/        # Google特定驱动
├── build.config               # 内核构建配置文件
└── .repo/                     # repo元数据(勿手动修改)
目录/文件 用途 驱动开发关注点
common/ 主线内核源码,包含所有通用驱动框架 驱动代码存放位置,编译入口
common/drivers/ 按子系统分类的驱动源码 根据驱动类型选择子目录(char/i2c/spi等)
common/arch/arm64/configs/ 设备默认内核配置文件 确认defconfig是否包含驱动配置项
build.config 内核编译参数配置 设置交叉编译工具链、编译选项
private/ 厂商闭源或未合入主线的驱动 可能需要在此添加自定义驱动

2.7 常见问题与解决方案

常见错误1: repo sync 失败,提示 "fatal: unable to access"
原因: 网络连接不稳定或Git服务器超时
解决: 使用国内镜像源,或增加Git缓冲区大小:git config --global http.postBuffer 524288000
常见错误2: 内核分支与Android版本不匹配,编译时出现大量宏未定义错误
原因: 选择了错误的内核分支
解决: 通过 repo manifest -r 查看当前manifest指定的确切分支和提交ID,与目标设备对比
最佳实践: 在开始驱动开发前,建议先执行 repo diff 确认工作区干净,然后使用 repo start <feature-branch> --all 创建统一的分支基线,便于后续代码管理和回退。