2. 开发环境搭建
Android BSP 开发的第一步不是写代码,而是把“能编译出镜像”的环境搭起来。高通平台的 BSP 源码体量巨大,一个完整的 Android + QCOM 基线往往在 100GB 以上,涉及数百个 Git 仓库,因此它既不是简单 git clone 能拿下来的,也不是随便一台笔记本能编得动的。本节围绕四件事展开:从 CodeAurora 获取源码、用 repo 管理多仓库、配置编译服务器、安装必备软件包。
一、CodeAurora 与源码获取方式
CodeAurora Forum(CAF)是高通对外开放的源码托管平台,地址为 https://source.codeaurora.org。高通把 Android BSP 拆成两类内容:一类是公开的 CAF 仓库(如 kernel/msm、platform/vendor/qcom-opensource/...),另一类是需授权才能访问的专有仓库(如 vendor/qcom/proprietary)。公开部分可直接匿名拉取,专有部分需要高通账号并绑定到具体项目后,通过 git:// 或 https:// 带凭据访问。
实际项目中,源码通常由高通或方案商以“发布包”形式提供,包含一个 manifest.xml(repo 清单)和若干 .git 仓库。获取方式有两种:
- 方式 A:repo init 直接拉取——适用于公开基线,如
repo init -u https://source.codeaurora.org/quic/la/platform/manifest -b release。 - 方式 B:解压发布包 + repo sync——适用于含专有仓库的项目,先解压厂商提供的
*.tar.gz,再在已有.repo目录上执行repo sync补齐。
无论哪种方式,最终目录结构都应包含 .repo/、build/、kernel/、device/、vendor/、platform/ 等顶层目录。判断源码是否完整,可检查 .repo/manifest.xml 是否存在、repo status 是否无报错。
二、repo 工具的使用
repo 是 Google 为 Android 多仓库管理写的 Python 工具,本质是对 git 的封装。它通过 manifest.xml 描述“哪些仓库、放在哪个路径、用哪个分支”。常用命令如下:
# 1. 安装 repo(放到 PATH 中)
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
# 2. 初始化,指定 manifest 仓库与分支
repo init -u https://source.codeaurora.org/quic/la/platform/manifest -b release
# 3. 同步全部仓库(-j 并发数,-c 只拉当前分支)
repo sync -j8 -c --no-tags
# 4. 查看状态与分支
repo status
repo branches
repo forall -c 'git log -1 --oneline' # 批量查看各仓库最新提交
几个关键点:repo sync 首次执行耗时长,建议加 -j8 以上并发;-c 只同步当前分支可显著减少下载量;--no-tags 避免拉取大量标签。若中途失败,重复执行 repo sync 即可续传。修改代码后,用 repo forall -c 'git diff' 可批量查看所有仓库改动,repo upload 用于向 Gerrit 提交评审。
三、编译服务器配置
高通 BSP 编译对机器要求较高。以 Android 13 + 骁龙 8 系基线为例,官方推荐至少 16 核 CPU、32GB 内存、500GB 以上 SSD 可用空间;若开启 ccache 或保留多套 out/,建议 1TB。内存不足 16GB 时,soong 与 ninja 并行编译极易触发 OOM,表现为 Killed 或 signal 9。
操作系统推荐 Ubuntu 20.04 LTS(64 位)。文件系统必须是大小写敏感且支持符号链接的 ext4,不要放在 NTFS 或挂载的共享目录上,否则会出现 Permission denied 或 Invalid argument。若使用虚拟机,需开启嵌套虚拟化并分配足够内存。
环境变量方面,把 ~/bin 加入 PATH 以便直接调用 repo;设置 JAVA_HOME 指向 Android 要求的 JDK(如 Android 13 用 OpenJDK 11);USE_CCACHE=1 与 CCACHE_DIR 可加速重复编译。示例:
export PATH=~/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export USE_CCACHE=1
export CCACHE_DIR=~/.ccache
ccache -M 50G
四、必备软件包安装
在 Ubuntu 上,先更新源,再一次性安装编译依赖。以下命令覆盖了 AOSP 与高通 BSP 常见依赖:
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl \
zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev \
libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig \
python3 python3-pip openjdk-11-jdk rsync bc ccache
安装完成后,用 git --version、python3 --version、java -version、ccache -V 逐项确认。若 repo 报 python: command not found,说明系统只有 python3,可创建软链接 sudo ln -s /usr/bin/python3 /usr/bin/python,或使用较新版本 repo(已兼容 python3)。
repo sync 建议在网络稳定时段执行,并保留 .repo 目录备份。若同步中断,直接重跑 repo sync 即可续传,无需删除已下载内容。repo init 与 repo sync,否则生成的 .repo 文件属主为 root,后续普通用户操作会频繁报权限错误。若已误操作,可用 sudo chown -R $USER:$USER .repo 修复。完成以上四步后,可用一条最小验证命令确认环境可用:进入源码根目录执行 source build/envsetup.sh,再执行 lunch 查看可选目标列表。若能看到类似 qssi-userdebug、msmnile-userdebug 的选项,说明源码、repo、编译服务器与依赖包均已就绪,可以进入后续的编译与烧录环节。