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 同步策略与优化

为了提高同步效率和稳定性,可以采用以下策略:

  1. 浅克隆同步: 使用 repo init --depth=1 和 repo sync -c(-c 表示只下载当前分支)减少数据量。
  2. 断点续传: repo sync 天然支持断点续传,网络中断后重新执行即可。
  3. 局部同步: 只同步特定项目组,例如只同步内核相关仓库。
# 只同步 kernel 相关项目(假设 manifest 中定义了 groups="kernel")
repo sync -j8 -c kernel

3.4 Repo 同步与 Manifest 工作流程

下图展示了从 repo init 到 repo sync 的完整工作流程,以及 Manifest 文件在其中扮演的核心角色。

Repo 同步与 Manifest 工作流程 1. repo init 2. 下载 Manifest 仓库 3. 解析 default.xml 4. repo sync 5. 并行克隆/拉取 6. 检出指定分支 关键说明: • Manifest 仓库(.repo/manifests)本身是一个 Git 仓库,用于管理 manifest 文件的版本。 • default.xml 是 Repo 的默认入口文件,定义了所有项目仓库的清单。 • repo sync 会读取 default.xml,为每个 <project> 执行 git clone 或 git pull。 • 使用 -j 参数可以并行执行多个 Git 操作,显著提升同步速度。 • 如果某个项目仓库同步失败,repo sync 会记录错误并继续同步其他仓库。

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 等命令。