4. 开发环境搭建:Ubuntu系统配置、Android源码下载与编译、AOSP环境搭建、交叉编译工具链配置
Camera HAL 开发依赖一套完整且稳定的底层环境。本章从零开始,依次完成 Ubuntu 系统基础配置、AOSP 源码下载与编译、交叉编译工具链配置 三个核心环节。每一步都直接影响后续 HAL 模块的编译、调试与集成效率。
环境版本建议:推荐使用 Ubuntu 20.04 LTS(64-bit),搭配 Android 12(AOSP android-12.0.0_r32)或 Android 13。内存至少 16 GB,磁盘预留 300 GB 以上(SSD 优先)。
4.1 Ubuntu 系统基础配置
干净的 Ubuntu 系统需要安装必要的依赖包、配置 Git 与 Repo 工具、调整文件描述符限制。
4.1.1 安装必备依赖包
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
关键包说明:
- git-core / gnupg:版本控制与签名验证
- flex / bison:词法/语法分析器,编译内核与 HAL 必需
- gcc-multilib / g++-multilib:支持 32 位与 64 位交叉编译
- libncurses5 / lib32ncurses5-dev:终端界面库,menuconfig 依赖
4.1.2 配置 Git 与 Repo
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 安装 Repo 工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
4.1.3 调整文件描述符与交换空间
# 增大文件描述符上限(编译 AOSP 需要)
echo "fs.file-max = 65536" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 创建 8 GB 交换文件(内存不足时保底)
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
常见踩坑:如果使用虚拟机,务必给磁盘分配 动态扩展 或直接 300 GB 固定大小。AOSP 完整编译一次会占用 150–200 GB,且编译过程中临时文件峰值可能超过 250 GB。
4.2 AOSP 源码下载与编译
AOSP(Android Open Source Project)是 Camera HAL 的母体环境。HAL 模块必须放在 AOSP 源码树中,通过 Android.bp / Android.mk 参与整体编译。
4.2.1 下载 AOSP 源码
mkdir -p ~/aosp/android-12
cd ~/aosp/android-12
# 初始化仓库(以 android-12.0.0_r32 为例)
repo init -u https://android.googlesource.com/platform/manifest \
-b android-12.0.0_r32
# 同步全部源码(耗时 2–6 小时,视网络而定)
repo sync -c -j8
加速技巧:使用国内镜像(如中科大、清华 TUNA)替换 manifest URL:
repo init -u https://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-12.0.0_r32
4.2.2 编译 AOSP 完整系统
cd ~/aosp/android-12
# 加载编译环境
source build/envsetup.sh
# 选择目标设备(以 Pixel 6 为例:bluejay)
lunch aosp_bluejay-userdebug
# 开始编译(-j 后跟 CPU 核心数 × 2)
make -j16
首次完整编译耗时约 1–3 小时。编译产物位于 out/target/product/<device>/ 目录。
4.2.3 编译产物结构(关键路径)
| 路径 | 说明 |
|---|---|
out/target/product/<device>/system/ |
系统分区镜像,包含 HAL 库、服务、配置文件 |
out/target/product/<device>/vendor/ |
厂商分区,存放 Camera HAL 实现、传感器驱动 |
out/target/product/<device>/ramdisk.img |
启动 ramdisk,包含 init 脚本与早期 HAL 加载逻辑 |
out/host/linux-x86/bin/ |
主机端工具,如 adb、fastboot、halserver |
4.3 交叉编译工具链配置
Camera HAL 运行在 ARM64 设备上,但编译在 x86_64 主机完成。必须配置正确的交叉编译工具链,否则链接阶段会报“未定义的引用”或“架构不匹配”。
4.3.1 AOSP 内置工具链 vs 独立工具链
| 类型 | 路径 | 适用场景 |
|---|---|---|
| AOSP 内置 | prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/ |
编译 AOSP 树内的 HAL 模块(推荐) |
| 独立 NDK 工具链 | prebuilts/ndk/current/toolchains/llvm/prebuilt/linux-x86_64/bin/ |
编译独立 HAL 库或第三方算法库 |
| 自定义 Linaro 工具链 | 手动下载 gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu |
内核模块或裸机驱动开发 |
4.3.2 验证工具链可用性
# 检查 AOSP 内置 GCC
aarch64-linux-android-gcc --version
# 检查 LLVM/Clang(AOSP 默认编译器)
clang --version
# 测试编译一个最小 C 文件
echo 'int main(){ return 0; }' > test.c
aarch64-linux-android-gcc test.c -o test_arm64
file test_arm64
# 输出应包含:ELF 64-bit LSB executable, ARM aarch64
工具链陷阱:不要混用不同版本的 GCC 与 Clang 编译同一个模块。AOSP 从 Android 8 开始默认使用 Clang,如果强制指定 GCC 编译 HAL,可能触发
__aeabi_* 符号缺失或 ABI 不兼容。
4.3.3 为独立 HAL 模块配置 CMake 交叉编译
当 HAL 模块脱离 AOSP 树单独开发时,需要编写 toolchain.cmake:
# toolchain_arm64.cmake
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 30)
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
set(CMAKE_ANDROID_NDK /path/to/ndk)
set(CMAKE_ANDROID_STL_TYPE c++_shared)
# 使用 CMake 交叉编译
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain_arm64.cmake \
-DCMAKE_BUILD_TYPE=Release \
-B build_arm64
cmake --build build_arm64
4.4 开发环境整体架构
下图展示了从主机 Ubuntu 到目标设备 Camera HAL 的完整工具链与数据流关系:
4.5 环境验证清单
完成上述步骤后,建议逐项确认以下检查点,避免后续 HAL 开发时反复排查环境问题:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| Repo 可用 | repo --version |
显示 Repo 版本号(≥ 2.0) |
| AOSP 源码完整性 | repo status |
无未同步或冲突文件 |
| 编译环境加载 | source build/envsetup.sh && lunch |
显示已选 target 信息 |
| 交叉编译器 | aarch64-linux-android-gcc --version |
显示 GCC 4.9 或更高版本 |
| Clang 编译器 | clang --version |
显示 Android 对应 Clang 版本 |
| adb 连接设备 | adb devices |
列出已连接的设备序列号 |
最佳实践:建议将环境检查脚本化,每次新开终端或切换分支后执行一次,确保所有路径和变量正确。示例脚本片段:
#!/bin/bash
export PATH=~/bin:$PATH
source ~/aosp/android-12/build/envsetup.sh
lunch aosp_bluejay-userdebug
echo "=== 环境就绪 ==="
4.6 本章小结
本章完成了 Camera HAL 开发所需的全部底层环境搭建:
- Ubuntu 系统配置:依赖包、Git/Repo、文件描述符与交换空间
- AOSP 源码下载与编译:repo init/sync、lunch、make 完整流程
- 交叉编译工具链配置:内置 GCC/Clang 验证、独立 CMake 工具链编写
- 环境验证清单:6 项关键检查点,确保后续 HAL 开发零环境阻力