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版本对应一组特定的内核分支和提交。
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 ...
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:
原因: 网络连接不稳定或Git服务器超时
解决: 使用国内镜像源,或增加Git缓冲区大小:
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 创建统一的分支基线,便于后续代码管理和回退。