3. 开发环境搭建:Ubuntu系统配置、Android源码下载与编译、交叉编译工具链配置、NDK环境准备

在开始集成第三方算法库之前,必须搭建一套完整、可复现的开发环境。本章将按照从底层操作系统到上层编译工具链的顺序,逐步完成 Ubuntu 系统配置、Android 源码(AOSP)下载与编译、交叉编译工具链配置以及 NDK 环境准备。这套环境是后续所有 HAL 层开发、算法集成和调试工作的基础。

3.1 Ubuntu 系统基础配置

推荐使用 Ubuntu 20.04 LTS (Focal Fossa) 或 22.04 LTS (Jammy Jellyfish) 作为宿主操作系统。AOSP 官方对这两个版本有较好的支持。

3.1.1 系统依赖包安装

编译 AOSP 和 Camera HAL 需要大量系统库和工具。执行以下命令安装核心依赖:

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
版本提示: 如果使用 Ubuntu 22.04,请确保安装 openjdk-11-jdk(AOSP master 分支已转向 JDK 17,但 Android 12/13 仍依赖 JDK 11)。Python 3.8+ 是必须的,Python 2.7 已不再被 AOSP 支持。

3.1.2 Git 与 Repo 工具配置

Android 源码使用 repo 工具管理多个 Git 仓库。配置步骤如下:

  1. 安装 Git 并配置用户信息:
    git config --global user.name "Your Name"
    git config --global user.email "your.email@example.com"
  2. 安装 Repo 工具:
    mkdir -p ~/bin
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    export PATH=$PATH:~/bin
  3. 将 PATH 写入 ~/.bashrc:
    echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
    source ~/.bashrc
网络注意事项: 由于 Google 服务器访问限制,建议配置 Git 代理或使用国内镜像源(如中科大、清华 AOSP 镜像)。在 repo init 时使用 --depth=1 参数可减少初始下载量。

3.2 Android 源码下载与编译

Camera HAL 是 AOSP 的一部分,因此需要完整的 Android 源码树。以下步骤以 Android 13 (T) 为例。

3.2.1 源码下载流程

步骤 命令 说明
1. 创建工作目录 mkdir ~/aosp-13 && cd ~/aosp-13 建议预留至少 200GB 磁盘空间
2. 初始化仓库 repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41 使用特定分支标签
3. 同步源码 repo sync -c -j8 -c 只下载当前分支,-j8 并行任务数
关键路径: Camera HAL 相关代码位于 hardware/interfaces/camera/ 和 hardware/libhardware/modules/camera/。第三方算法库通常集成在 vendor/ 或 device/ 目录下。

3.2.2 编译环境初始化与目标选择

源码同步完成后,执行以下命令初始化编译环境:

source build/envsetup.sh
lunch aosp_arm64-userdebug

lunch 命令选择编译目标。常用组合如下:

目标 架构 用途
aosp_arm64-userdebug ARM64 真机调试,推荐用于 HAL 开发
aosp_x86_64-userdebug x86_64 模拟器调试,快速验证
aosp_arm64-eng ARM64 工程版本,包含更多调试工具

3.2.3 编译 Camera HAL 模块

全量编译耗时较长,开发阶段建议只编译 Camera 相关模块:

# 编译 Camera HAL 实现
make android.hardware.camera.provider@2.7-impl -j$(nproc)

# 编译 Camera 服务
make cameraserver -j$(nproc)

# 编译所有 Camera 相关模块(推荐)
make camera -j$(nproc)
增量编译技巧: 修改 HAL 代码后,使用 mm 命令在模块目录下直接编译,速度远快于 make。例如:cd hardware/interfaces/camera/provider/2.7/default && mm。

3.3 交叉编译工具链配置

Camera HAL 最终运行在 ARM64 设备上,但开发在 x86_64 主机上进行,因此需要交叉编译工具链。AOSP 自带工具链,但集成第三方算法库时通常需要独立配置。

3.3.1 AOSP 自带工具链

执行 lunch 后,AOSP 会自动设置交叉编译环境变量:

echo $CC
# 输出类似: prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang

echo $CXX
# 输出类似: prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang++

这些工具链位于 prebuilts/ 目录下,支持 ARM、ARM64、x86、x86_64 目标架构。

3.3.2 独立交叉编译工具链(用于第三方算法库)

当第三方算法库使用 CMake 或 Makefile 构建时,需要显式指定交叉编译器。推荐使用 Android NDK 提供的独立工具链:

# 使用 NDK 的 make_standalone_toolchain.py 脚本(NDK r23+)
python $ANDROID_NDK/build/tools/make_standalone_toolchain.py \
  --arch arm64 \
  --api 33 \
  --install-dir ~/toolchains/aarch64-linux-android

# 设置环境变量
export PATH=$PATH:~/toolchains/aarch64-linux-android/bin
export CC=aarch64-linux-android33-clang
export CXX=aarch64-linux-android33-clang++
架构与 API 级别对照:
  • ARM64: aarch64-linux-android,API 33 对应 Android 13
  • ARM: armv7a-linux-androideabi,API 33
  • x86_64: x86_64-linux-android,API 33

3.4 NDK 环境准备

NDK(Native Development Kit)是编译 C/C++ 原生代码的核心工具集,也是集成第三方算法库的桥梁。

3.4.1 NDK 版本选择与下载

Android 版本 推荐 NDK 版本 说明
Android 12 (S) NDK r23b 或 r24 稳定,兼容性好
Android 13 (T) NDK r25 或 r26 支持最新 LLVM 工具链
Android 14 (U) NDK r26+ 必须使用最新版本

下载与解压:

wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip
unzip android-ndk-r25c-linux.zip -d ~/
export ANDROID_NDK=~/android-ndk-r25c

3.4.2 NDK 目录结构解析

理解 NDK 目录结构有助于正确配置编译脚本:

android-ndk-r25c/
├── build/          # 构建系统和 cmake 工具链文件
├── meta/           # 平台和架构元数据
├── ndk-build/      # ndk-build 脚本(传统构建方式)
├── platforms/      # 各 API 级别的系统库和头文件
├── prebuilt/       # 主机工具(linux-x86_64)
├── python-packages/
├── shader-tools/
├── simpleperf/     # 性能分析工具
├── sources/        # 公共库源码(cxx-stl, cpufeatures 等)
├── toolchains/     # 交叉编译工具链(llvm, gcc 等)
└── ndk-build       # 入口脚本

3.4.3 验证 NDK 环境

编写一个简单的 C 程序,使用 NDK 交叉编译验证:

// hello_hal.c
#include <stdio.h>
int main() {
    printf("Camera HAL NDK environment OK!\n");
    return 0;
}
$CC -o hello_hal hello_hal.c
file hello_hal
# 输出: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV)
CMake 集成 NDK: 在第三方算法库的 CMakeLists.txt 中,通过 -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake 指定 NDK 工具链,并设置 -DANDROID_ABI=arm64-v8a 和 -DANDROID_PLATFORM=android-33。

3.5 开发环境整体架构

下图展示了开发环境中各组件之间的关系和数据流:

Camera HAL 开发环境架构图 主机开发环境 (Ubuntu 20.04/22.04 x86_64) AOSP 源码树 hardware/interfaces/camera/ Android NDK r25c 交叉编译工具链 + 系统库 第三方算法库源码 CMakeLists.txt + .c/.cpp 编译工具链:Clang/LLVM + GNU binutils + Make/Ninja 交叉编译目标:aarch64-linux-android (API 33) 目标设备 (Android ARM64 真机) Camera HAL 服务 camera.provider@2.7 集成算法库 (.so) libalg_face.so / libalg_hdr.so Android 框架层 CameraService / Camera2 API adb push / fastboot flash 关键集成路径说明 1. 第三方算法库通过 NDK 交叉编译为 ARM64 动态库 (.so) 2. 算法 .so 被 Camera HAL 实现通过 dlopen 或链接方式加载 3. 编译产物通过 adb push 到 /vendor/lib64/ 或 /system/lib64/ 下

3.6 环境验证清单

完成上述配置后,使用以下清单逐项验证环境正确性:

验证项 验证方法 预期结果
Ubuntu 依赖 dpkg -l | grep build-essential 显示已安装
Repo 工具 repo --version 显示版本号 (≥ 2.0)
AOSP 编译 make android.hardware.camera.provider@2.7-impl -j4 编译成功,无错误
NDK 交叉编译 编译 hello_hal.c 并执行 file 显示 ELF 64-bit ARM aarch64
独立工具链 aarch64-linux-android33-clang --version 显示 Clang 版本信息
常见问题:
  • 磁盘空间不足: AOSP 完整编译需要 150-200GB,建议使用 ext4 文件系统,避免 NTFS/exFAT 导致符号链接错误。
  • Python 版本冲突: Ubuntu 20.04 默认 Python 3.8,如果系统同时存在 Python 2.7,确保 python 指向 Python 3。
  • 内存不足: 编译 Camera HAL 至少需要 8GB RAM,推荐 16GB+。可使用 -j$(nproc --ignore=2) 降低并行度。

3.7 本章小结