3. AOSP 源码下载与同步:Repo 工具的使用、manifest 文件解析、源码分支选择与同步策略
在开始 Android 内核开发之前,获取并管理庞大的 AOSP 源码树是第一步,也是最关键的一步。AOSP 包含数百个 Git 仓库,总大小超过 100GB。手动逐个克隆这些仓库是不现实的。Google 为此提供了 Repo 工具,它本质上是一个基于 Python 的脚本,用于在多个 Git 仓库上执行批量操作,其核心逻辑由 manifest 文件驱动。
3.1 Repo 工具:多仓库管理指挥官
Repo 并非 Git 的替代品,而是 Git 的“指挥官”。它将 AOSP 视为一个由多个 Git 仓库组成的项目集合(Project Set)。Repo 通过一个 XML 格式的 manifest 文件来定义这个集合中每个仓库的远程地址、目标路径、分支和标签。
核心概念: Repo 将 Git 仓库分为两类:manifest 仓库(包含 .repo/manifests 目录)和 项目仓库(AOSP 的各个子模块)。Repo 命令会同步 manifest 仓库,然后根据其内容同步所有项目仓库。
3.1.1 Repo 安装与初始化
Repo 工具的安装通常通过 Google 的官方源进行。由于网络环境限制,国内开发者可能需要使用镜像源。
# 1. 创建 bin 目录并加入 PATH
mkdir -p ~/bin
export PATH=~/bin:$PATH
# 2. 下载 Repo 工具(使用清华镜像源加速)
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod a+x ~/bin/repo
# 3. 验证安装
repo --version
初始化一个 AOSP 工作目录,需要指定 manifest 仓库的 URL 和分支。
# 创建一个工作目录
mkdir aosp-source
cd aosp-source
# 初始化 Repo,指定 Android 14 的稳定分支
# 使用清华 AOSP 镜像源
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest \
-b android-14.0.0_r35 \
--depth=1
参数说明:
-u:指定 manifest 仓库的 Git URL。-b:指定 manifest 仓库的分支,即 AOSP 的版本分支。--depth=1:创建浅克隆(shallow clone),只下载最新版本,大幅减少下载量,适合快速构建。
3.1.2 Repo 同步:拉取全部源码
repo sync 是使用频率最高的命令。它会根据 .repo/manifests/default.xml 文件,并行拉取或更新所有项目仓库。
# 同步所有项目仓库(使用 -j 参数并行下载,加速同步)
repo sync -j8
# 如果同步中断,可以继续执行,repo 会断点续传
repo sync -j4 --fail-fast
网络与存储警告:
- 首次同步 AOSP 完整源码(含历史)可能需要 100GB+ 磁盘空间和数小时时间。
- 使用
--depth=1可将下载量控制在 30GB 左右。 - 建议使用国内镜像源(如清华、中科大)并保持网络稳定。
3.2 Manifest 文件解析:AOSP 的“地图”
Manifest 文件是 Repo 的核心配置文件,通常位于 .repo/manifests/default.xml。它定义了 AOSP 源码树的完整结构。
以下是一个简化的 manifest 文件结构示例:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="aosp"
fetch="https://android.googlesource.com/"
review="https://android-review.googlesource.com/" />
<default revision="refs/tags/android-14.0.0_r35"
remote="aosp"
sync-j="4" />
<project path="build/make" name="platform/build" groups="pdk" />
<project path="art" name="platform/art" groups="pdk" />
<project path="kernel/msm" name="kernel/msm" revision="refs/heads/android-msm-wahoo-4.4-pie-qpr2" />
<project path="packages/apps/Settings" name="platform/packages/apps/Settings" />
<include name="another_manifest.xml" />
</manifest>
3.2.1 关键标签解析
| 标签 | 属性 | 说明 |
|---|---|---|
| <remote> | name, fetch, review |
定义远程 Git 服务器的别名和基础 URL。所有项目仓库的完整 URL 由 fetch + name 拼接而成。 |
| <default> | revision, remote, sync-j |
为所有未显式指定属性的 <project> 提供默认值。通常指定默认分支或 Tag。 |
| <project> | path, name, revision, groups |
定义一个 Git 仓库。path 是本地工作目录的相对路径,name 是远程仓库的名称。 |
| <include> | name |
引入另一个 manifest 文件,用于模块化管理大型项目。 |
路径拼接规则: 对于
<project name="platform/build">,其完整 Git 远程 URL 为 https://android.googlesource.com/platform/build。本地路径则为 build/make。
3.3 源码分支选择与同步策略
选择正确的分支是保证开发顺利进行的前提。AOSP 的分支命名遵循特定规则,反映了 Android 版本、安全补丁级别和硬件平台。
3.3.1 分支命名规则
| 分支示例 | 含义 |
|---|---|
android-14.0.0_r35 |
Android 14 的正式发布版本,Tag 名,最稳定。 |
android-14.0.0_r35.0.1 |
包含特定安全补丁的月度更新版本。 |
android-msm-wahoo-4.4-pie-qpr2 |
针对特定 SoC(高通 MSM)和硬件平台(Wahoo/Pixel 2)的内核分支。 |
master / main |
开发主线,包含最新特性,但稳定性较差,不推荐用于生产环境。 |
3.3.2 分支选择策略
- 内核开发: 选择与目标设备 SoC 匹配的内核分支,例如
android-msm-wahoo-4.4。通常这些分支在kernel/目录下的 manifest 中单独指定。 - 系统开发: 选择最新的稳定 Tag,如
android-14.0.0_r35。避免使用master分支。 - CTS/VTS 测试: 必须使用 Google 官方认证的 Tag 分支,以确保兼容性。
3.3.3 同步策略与优化
为了提高同步效率和稳定性,可以采用以下策略:
- 浅克隆同步: 使用
repo init --depth=1和repo sync -c(-c表示只下载当前分支)减少数据量。 - 断点续传:
repo sync天然支持断点续传,网络中断后重新执行即可。 - 局部同步: 只同步特定项目组,例如只同步内核相关仓库。
# 只同步 kernel 相关项目(假设 manifest 中定义了 groups="kernel")
repo sync -j8 -c kernel
3.4 Repo 同步与 Manifest 工作流程
下图展示了从 repo init 到 repo sync 的完整工作流程,以及 Manifest 文件在其中扮演的核心角色。
3.5 常见问题与避坑指南
常见错误:
- “fatal: manifest ‘default.xml’ not found”: 通常是因为
repo init时指定的 manifest 仓库 URL 错误或网络不通。 - “error: Exited sync due to fetch errors”: 某个项目仓库无法连接。可以尝试
repo sync --fail-fast定位具体仓库,或更换网络环境。 - “repo: command not found”: 确保
~/bin已加入PATH环境变量,并且repo文件具有可执行权限。
高效同步技巧:
- 使用
repo sync -c -j8 --no-tags:-c只同步当前分支,--no-tags不获取标签,进一步减少数据量。 - 定期执行
repo sync保持源码更新,但注意不要随意切换分支,以免造成本地修改冲突。 - 对于内核开发,可以只同步
kernel/目录下的项目,使用repo sync kernel/msm等命令。