3. 同步AOSP源码

任务目标

在本地Linux环境中,通过repo工具将指定版本的AOSP(Android Open Source Project)源码完整同步到本地磁盘,并验证源码树结构完整、版本信息正确,为后续ROM编译提供干净的源码基础。

环境与依赖

  • 操作系统:Ubuntu 20.04+(或Debian 10+),x86_64架构
  • 磁盘空间:至少300GB可用空间(AOSP全量源码约150GB,编译产物另需空间)
  • 内存:建议16GB以上
  • 必要工具:git、python3、curl,以及repo工具本身

安装repo工具:

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

核心实现:同步AOSP源码

以下脚本完成从初始化repo到同步完成的全过程。选择Android 13(T)稳定分支android-13.0.0_r75作为示例版本,该分支对应Pixel 6系列设备,可稳定编译。

#!/bin/bash
# sync_aosp.sh - AOSP源码同步脚本
# 用法: ./sync_aosp.sh [源码根目录路径]

set -e  # 任何错误立即退出

# 配置区
AOSP_ROOT="${1:-~/aosp}"          # 源码根目录,默认 ~/aosp
AOSP_BRANCH="android-13.0.0_r75"  # 目标分支
REPO_URL="https://android.googlesource.com/platform/manifest"

# 创建源码根目录
mkdir -p "$AOSP_ROOT"
cd "$AOSP_ROOT"

# 初始化repo(首次执行时)
if [ ! -f ".repo/manifest.xml" ]; then
    echo "==> 初始化repo,分支: $AOSP_BRANCH"
    repo init -u "$REPO_URL" -b "$AOSP_BRANCH" --depth=1
fi

# 同步全部源码
echo "==> 开始同步源码(此步骤耗时较长,请保持网络稳定)"
repo sync -j$(nproc) -c  # -c: 仅同步当前分支,--depth=1配合使用减少数据量

# 验证同步结果
echo "==> 验证源码完整性"
if [ -f "build/envsetup.sh" ] && [ -d "frameworks/base" ] && [ -d "kernel" ]; then
    echo "源码树结构验证通过"
else
    echo "错误: 源码树不完整,缺少关键目录" >&2
    exit 1
fi

# 输出版本信息
echo "==> 当前源码版本:"
grep -m1 "PLATFORM_VERSION" build/core/version_defaults.mk 2>/dev/null || \
    grep -m1 "PLATFORM_VERSION" build/soong/soong_variables.go 2>/dev/null || \
    echo "版本信息位于build目录中,可后续通过编译系统确认"

echo "==> 同步完成"

运行方式

  1. 将上述脚本保存为sync_aosp.sh,赋予执行权限:chmod +x sync_aosp.sh
  2. 执行同步:./sync_aosp.sh /data/aosp(将/data/aosp替换为实际目标路径,确保该分区有足够空间)
  3. 同步过程中可另开终端执行df -h /data/aosp监控磁盘占用

验证方法与通过条件

同步完成后,按以下步骤验证源码可用性:

cd /data/aosp
# 1. 检查repo状态是否干净
repo status | head -20   # 应无输出或仅显示未跟踪文件

# 2. 验证关键目录存在
ls -d build frameworks kernel packages  # 应全部存在

# 3. 验证git分支正确
cd frameworks/base && git branch -a | head -5  # 应显示android-13.0.0_r75

# 4. 统计源码体量(预期约150GB)
du -sh . --exclude=.repo

通过条件:以上命令均正常执行,repo status无错误输出,关键目录存在,frameworks/base的git分支为android-13.0.0_r75,源码总大小在120GB以上(因--depth=1裁剪历史,体积会小于全量)。满足以上条件即视为同步成功,可进入下一步源码编译准备。

常见问题

  • 网络中断导致同步失败:重新执行repo sync即可断点续传,repo会自动跳过已完成的仓库。
  • 磁盘空间不足:使用--depth=1参数已显著减少数据量(约节省30%空间),若仍不足请清理磁盘或更换更大分区。
  • Python版本不兼容:repo需要Python 3.6+,检查python3 --version,必要时通过update-alternatives切换默认Python版本。