2. 开发环境搭建:Linux开发环境配置、Android源码下载与编译、AOSP环境搭建、交叉编译工具链配置
手机相机HAL驱动开发依赖一套完整、稳定的底层环境。本章从零开始搭建开发环境,涵盖Linux系统配置、AOSP源码管理、编译工具链安装以及交叉编译验证。环境搭建的质量直接影响后续调试效率,建议严格按步骤操作。
2.1 硬件与操作系统选型
| 项目 | 推荐配置 | 最低配置 |
|---|---|---|
| CPU | AMD Ryzen 9 / Intel i9 (16核以上) | Intel i7 (8核) |
| 内存 | 64 GB DDR5 | 32 GB DDR4 |
| 磁盘 | 1 TB NVMe SSD + 2 TB HDD | 500 GB SSD |
| 操作系统 | Ubuntu 22.04 LTS (x86_64) | Ubuntu 20.04 LTS |
| 网络 | 千兆光纤 (稳定下载AOSP) | 百兆宽带 |
经验提示: 强烈建议使用Ubuntu 22.04 LTS。AOSP master分支已逐步弃用Python 2,Ubuntu 22.04自带Python 3.10+,可避免大量依赖冲突。磁盘建议预留至少400 GB空闲空间(单次完整编译约需250 GB)。
2.2 Linux开发环境基础配置
安装必要的系统包和开发工具,这是后续所有工作的基础。
# 更新软件源
sudo apt update && sudo apt upgrade -y
# 安装基础开发工具
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
# 安装Python与Repo工具
sudo apt install -y python3 python3-pip
sudo curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/local/bin/repo
sudo chmod a+x /usr/local/bin/repo
# 安装OpenJDK (AOSP 12+ 需要JDK 11)
sudo apt install -y openjdk-11-jdk
# 验证安装
gcc --version
python3 --version
repo --version
java -version
常见陷阱: 不要使用Ubuntu默认的Python 2.7。AOSP从android-12.0.0_r1开始,构建系统已全面迁移至Python 3。若系统同时存在python2和python3,请确保
python命令指向python3,或使用export PYTHON=python3。
2.3 AOSP源码下载与分支管理
AOSP(Android Open Source Project)源码体积庞大,使用Google官方repo工具进行多仓库管理。相机HAL驱动通常位于hardware/interfaces/camera、hardware/libhardware和vendor/目录下。
2.3.1 初始化Repo工作目录
# 创建工作目录(建议放在SSD分区)
mkdir ~/aosp
cd ~/aosp
# 配置Git身份(必须,否则repo同步会报错)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 初始化指定分支(以android-13.0.0_r41为例)
repo init -u https://android.googlesource.com/platform/manifest \
-b android-13.0.0_r41 --depth=1
# 同步源码(-j4表示4个并行任务,根据CPU核心数调整)
repo sync -j8 -c --no-tags
关键参数说明:
--depth=1:只下载最新版本,大幅减少下载量(从~80 GB降至~30 GB)。-c:仅同步当前分支,不下载其他分支的引用。--no-tags:跳过标签下载,节省时间和磁盘。
2.3.2 常用AOSP分支与相机HAL版本对应
| Android版本 | 推荐分支 | Camera HAL版本 | 关键变更 |
|---|---|---|---|
| Android 12 | android-12.1.0_r27 | HAL3 + HIDL | 引入camera.provider@2.6 |
| Android 13 | android-13.0.0_r41 | HAL3 + AIDL | HIDL转AIDL过渡,camera.provider@2.7 |
| Android 14 | android-14.0.0_r15 | HAL3 + AIDL | 完全移除HIDL,camera.provider@2.8 |
2.4 AOSP编译环境搭建
编译AOSP需要配置环境变量和选择正确的编译目标。相机HAL驱动通常作为系统镜像的一部分编译,也可单独编译为共享库进行测试。
2.4.1 加载编译环境
# 进入AOSP根目录
cd ~/aosp
# 加载编译环境脚本
source build/envsetup.sh
# 选择编译目标(以Pixel 6为例)
lunch aosp_bluejay-userdebug
# 常用目标说明:
# aosp_bluejay-userdebug - Pixel 6,带debug权限
# aosp_raven-userdebug - Pixel 7 Pro
# sdk_phone_x86_64 - 模拟器x86_64
2.4.2 编译相机HAL模块(单独编译)
# 编译单个模块(相机HAL接口)
make android.hardware.camera.provider@2.7-service
# 编译相机HAL测试用例
make camera2hal3test
# 编译完成后输出路径:
# out/target/product/bluejay/vendor/lib64/hw/camera.bluejay.so
# out/target/product/bluejay/vendor/bin/hw/android.hardware.camera.provider@2.7-service
效率技巧: 首次编译建议使用
make -j$(nproc)全量编译,耗时约40~90分钟。后续修改HAL代码后,使用mma(在模块目录下执行)或make <模块名>进行增量编译,通常只需1~3分钟。
2.5 交叉编译工具链配置
相机HAL驱动最终运行在ARM64(或ARM32)的Android设备上,必须在x86_64开发机上使用交叉编译工具链生成目标代码。AOSP自带工具链,但独立开发HAL模块时也可使用NDK工具链。
2.5.1 AOSP内置工具链
执行lunch后,AOSP会自动设置交叉编译环境变量:
# 查看当前交叉编译工具链
echo $CC
# 输出示例:prebuilts/clang/host/linux-x86/clang-r450784e/bin/clang
echo $CXX
# 输出示例:prebuilts/clang/host/linux-x86/clang-r450784e/bin/clang++
# 查看目标架构
echo $TARGET_ARCH
# 输出:arm64
# 查看sysroot(系统头文件与库路径)
echo $OUT_DIR
# 输出:out/target/product/bluejay
2.5.2 独立NDK工具链(用于HAL模块原型验证)
当需要脱离AOSP全量编译,快速验证HAL算法或驱动逻辑时,可使用Android NDK独立工具链:
# 下载NDK(以r25c为例)
wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip
unzip android-ndk-r25c-linux.zip
# 使用NDK生成独立工具链
export NDK=~/android-ndk-r25c
python3 $NDK/build/tools/make_standalone_toolchain.py \
--arch arm64 \
--api 33 \
--install-dir ~/arm64-toolchain
# 添加到PATH
export PATH=~/arm64-toolchain/bin:$PATH
# 验证交叉编译器
aarch64-linux-android33-clang --version
# 输出:Android (7019983 based on r450784e) clang version 14.0.7
2.5.3 交叉编译验证示例
编写一个简单的相机HAL测试程序,验证工具链是否正常工作:
// test_hal.c
#include <stdio.h>
#include <hardware/camera_common.h>
int main() {
printf("Camera HAL version: %d\n", CAMERA_MODULE_API_VERSION_3_5);
printf("Cross-compilation toolchain works!\n");
return 0;
}
# 使用独立工具链编译
aarch64-linux-android33-clang test_hal.c \
-I ~/aosp/system/core/libcutils/include \
-I ~/aosp/hardware/libhardware/include \
-o test_hal_arm64
# 查看生成的文件类型
file test_hal_arm64
# 输出:ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV)
头文件路径注意: 独立编译HAL模块时,必须手动指定AOSP中的头文件路径。核心头文件位于
hardware/libhardware/include和system/core/libcutils/include。如果编译时提示找不到hardware/camera_common.h,请检查-I路径是否正确。
2.6 开发环境整体架构
下图展示了开发环境中各组件的关系与数据流:
2.7 环境验证清单
完成上述步骤后,使用以下清单逐项确认环境就绪:
- 系统包完整性:
dpkg -l | grep -E "build-essential|libncurses5|libx11-dev"确认已安装。 - Repo工具:
repo --version输出2.31+。 - AOSP源码:
ls ~/aosp/build/make/core/main.mk文件存在。 - 编译环境:
source build/envsetup.sh && lunch无报错。 - 交叉编译器:
aarch64-linux-android33-clang --version输出Clang版本号。 - 编译测试:
make android.hardware.camera.provider@2.7-service -j4编译成功。
环境就绪标志: 当你能在
out/target/product/<设备名>/vendor/lib64/hw/下看到camera.<设备名>.so文件时,说明整个开发环境已搭建完成,可以开始相机HAL驱动的开发与调试工作。