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 的完整工具链与数据流关系:

Camera HAL 开发环境架构图 Camera HAL 开发环境架构 主机开发环境(Ubuntu 20.04 x86_64) AOSP 源码树 交叉编译工具链 adb / fastboot HAL 源码 + Android.bp GCC / Clang / NDK 刷机与调试通道 编译产物(out/ 目录) system.img / vendor.img HAL .so / 配置文件 ramdisk / boot.img 目标设备(ARM64 Android) Camera HAL 3.x HIDL / AIDL 服务 内核驱动 adb push / fastboot flash

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 开发零环境阻力