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
3.1.2 Git 与 Repo 工具配置
Android 源码使用 repo 工具管理多个 Git 仓库。配置步骤如下:
- 安装 Git 并配置用户信息:
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=$PATH:~/bin - 将 PATH 写入 ~/.bashrc:
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc source ~/.bashrc
--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 并行任务数 |
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)
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++
- 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)
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake 指定 NDK 工具链,并设置 -DANDROID_ABI=arm64-v8a 和 -DANDROID_PLATFORM=android-33。
3.5 开发环境整体架构
下图展示了开发环境中各组件之间的关系和数据流:
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)降低并行度。