4. 开发环境搭建
Snapdragon Linux BSP 的构建不是“装个编译器就能编”的简单任务。一个可用的开发环境需要同时满足四类条件:主机侧具备正确的工具链与依赖库、交叉编译环境能产出目标架构(aarch64)可执行文件、源码通过 repo/git 被正确同步与版本锁定、构建服务器具备足够的算力与磁盘来承载完整镜像编译。本节围绕这四件事展开,给出可落地的配置路径与判断依据。
一、主机环境与依赖安装
高通 BSP 官方推荐在 Ubuntu 20.04/22.04 LTS 上构建,主机建议 8 核以上 CPU、32GB 内存、至少 400GB 可用磁盘(完整 Android+Linux 镜像编译峰值可超过 250GB)。依赖安装分两类:一类是编译工具与脚本运行依赖,另一类是 32 位兼容库(部分高通工具链与打包脚本仍依赖 i386 库)。
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl \
zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev \
libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip \
python3 python3-pip bc rsync ccache
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y libc6:i386 libstdc++6:i386
安装完成后用 python3 --version、gcc --version、dpkg -l | grep libc6:i386 三项确认。若 libc6:i386 缺失,后续打包 system.img 时会出现 error while loading shared libraries: libstdc++.so.6 之类的报错,这是最常见的环境问题之一。
二、交叉编译环境与工具链
交叉编译的核心是“在 x86_64 主机上生成 aarch64 目标代码”。高通 BSP 通常提供预编译工具链,例如 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu,解压后加入 PATH 即可使用。判断工具链是否可用,关键看三件事:目标架构、sysroot 路径、C 库版本。
export TOOLCHAIN=/opt/toolchains/gcc-arm-10.3-x86_64-aarch64-none-linux-gnu
export PATH=$TOOLCHAIN/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64
aarch64-none-linux-gnu-gcc -v
aarch64-none-linux-gnu-gcc -print-sysroot
内核编译时通过 make ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILE defconfig 指定架构与工具链前缀。若工具链与内核版本不匹配(例如内核要求 GCC 10 而主机使用 GCC 12),会出现 unrecognized command-line option 或结构体对齐错误,此时应显式指定 CC 与 LD 路径,而不是依赖系统默认 gcc。
三、repo/git 源码管理
高通 BSP 由数百个 git 仓库组成,通过 repo 清单(manifest)统一管理。repo 本身是一个 Python 脚本,负责按 manifest.xml 批量 clone/sync 各仓库并锁定 revision。
mkdir -p ~/bin && curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
repo init -u https://example.com/manifest.git -b release/snapdragon-6.1 -m default.xml
repo sync -c -j8 --no-tags --optimized-fetch
其中 -c 只同步当前分支,-j8 控制并发,--no-tags 减少冗余对象。同步完成后用 repo manifest -r -o pinned.xml 导出锁定版本,这是构建可复现的关键:pinned.xml 记录了每个仓库的确切 commit,后续任何一次构建都能回到同一状态。日常开发中,repo start mydev --all 为所有仓库创建本地分支,repo forall -c 'git status' 可批量检查改动。
四、构建服务器配置
当团队多人协作时,单机编译效率低且环境不一致。构建服务器应统一工具链版本、依赖包、repo 缓存与 ccache。推荐配置:16 核 CPU、64GB 内存、1TB NVMe SSD,并开启 ccache 加速重复编译。
export USE_CCACHE=1
export CCACHE_DIR=/mnt/ccache
ccache -M 100G
ccache -s
构建时用 make -j16 或 ./build.sh -j16 并行编译。判断构建是否成功,不能只看最后一行,应检查:内核 Image 与 dtb 是否生成、system.img/boot.img 是否产出、out/target/product/<board>/ 目录是否完整。若中途失败,优先看 out/error.log 与 build.log 中的第一个 error,而不是最后一个。
五、常见问题与判断依据
环境搭建阶段最典型的四类问题:其一,repo sync 中断后残留 .repo 锁,需删除 .repo/project-objects 下临时目录再重试;其二,工具链与内核版本不匹配导致编译报错,应核对 Makefile 中的 GCC_VERSION 要求;其三,ccache 未生效导致重复编译耗时,用 ccache -s 查看命中率,低于 60% 说明缓存目录或权限有问题;其四,构建服务器磁盘写满,通常发生在 out/ 目录,需定期清理 out/target/product/*/obj 中间产物。
envsetup.sh,每次开新终端 source envsetup.sh 即可,避免手动 export 遗漏导致的环境不一致。完成以上配置后,可以用一次最小构建验证环境:repo sync 后执行 make ARCH=arm64 defconfig 与 make -j16 Image dtbs,若能在 arch/arm64/boot/ 下看到 Image 与 dts/qcom/*.dtb,说明主机、工具链、源码三者已打通,可以进入后续的板级配置与镜像烧录阶段。