Android Camera HAL从零到项目落地 - 第2节
2.1 开发环境全景概览
在开始 Camera HAL 开发之前,必须搭建一套完整、可复现的 AOSP 开发环境。本章将引导你从零配置 Ubuntu 系统、下载 Android 源码、编译系统镜像,并掌握 adb 与 fastboot 这两个核心调试工具。整个环境是后续所有 Camera HAL 实验、调试与集成的基础。
环境要求速览:建议使用 Ubuntu 20.04 LTS 或 22.04 LTS,磁盘剩余空间 ≥ 400GB(源码 + 编译产物),内存 ≥ 16GB,CPU 核心数 ≥ 8。
2.2 Ubuntu 系统配置
2.2.1 基础依赖安装
AOSP 编译需要大量系统工具和库。以下命令安装核心依赖:
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
版本提示:Ubuntu 22.04 用户需额外安装
python2 和 libncurses5,因为部分 AOSP 旧工具链仍依赖 Python 2。
2.2.2 配置 Git 与 Repo 工具
Repo 是 Google 提供的多仓库管理工具,用于同步 AOSP 数千个 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=~/bin:$PATH
# 将上述 export 添加到 ~/.bashrc 以永久生效
2.2.3 安装 JDK
AOSP 13 及更高版本需要 OpenJDK 11 或更高版本。
sudo apt install -y openjdk-11-jdk
java -version # 验证安装
2.3 Android 源码下载
2.3.1 选择分支与初始化
以 Android 13 (T) 为例,选择稳定分支 android-13.0.0_r41。
mkdir ~/aosp
cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest \
-b android-13.0.0_r41
repo sync -c -j$(nproc) # 同步所有仓库,-c 只下载当前分支
网络注意事项:国内用户建议使用清华或中科大镜像源,将
https://android.googlesource.com 替换为 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP。首次同步约需 2-6 小时,视网络情况而定。
2.3.2 源码目录结构
了解关键目录对 Camera HAL 开发至关重要:
| 目录 | 说明 | Camera 相关度 |
|---|---|---|
frameworks/av/ | 多媒体框架,包含 CameraService | 高 |
hardware/interfaces/ | HIDL 接口定义,Camera HAL 接口在此 | 高 |
hardware/libhardware/ | 旧版 HAL 框架,Camera HAL1 定义 | 中 |
device/ | 设备厂商配置与 HAL 实现 | 高 |
vendor/ | 厂商私有库与 HAL 实现 | 高 |
system/core/ | adb、fastboot 等核心工具源码 | 低 |
2.4 AOSP 编译环境搭建
2.4.1 初始化编译环境
每次编译前需要加载 AOSP 的环境变量和函数:
cd ~/aosp
source build/envsetup.sh
lunch # 选择目标设备,例如 aosp_arm64-eng
lunch 命令会列出所有可用的编译目标。对于 Camera HAL 开发,常用目标:
| 目标名称 | 架构 | 用途 |
|---|---|---|
aosp_arm64-eng | ARM64 | 模拟器或通用 ARM64 设备 |
aosp_x86_64-eng | x86_64 | 模拟器(x86 架构) |
aosp_blueline-eng | ARM64 | Pixel 3 真机调试 |
aosp_coral-eng | ARM64 | Pixel 4 真机调试 |
选择建议:初期使用
aosp_arm64-eng 配合模拟器即可完成大部分 Camera HAL 接口验证。真机调试时再切换到对应设备目标。
2.4.2 执行编译
使用 make 命令启动编译。推荐使用 -j 参数指定并行任务数,通常为 CPU 核心数的 1.5~2 倍。
# 编译整个系统(首次约 2-4 小时)
make -j$(nproc)
# 仅编译指定模块(Camera HAL 开发常用)
make -j$(nproc) camera.hal
make -j$(nproc) cameraserver
make -j$(nproc) libcameraservice
2.4.3 编译产物与输出目录
编译完成后,所有输出文件位于 out/target/product/<device>/ 目录下:
| 文件/目录 | 说明 |
|---|---|
system.img | 系统镜像,包含 CameraService 和 HAL |
vendor.img | 厂商镜像,包含 HAL 实现库 |
boot.img | 内核与 ramdisk |
ramdisk.img | 初始文件系统 |
symbols/ | 带调试符号的库,用于 crash 分析 |
2.5 adb 与 fastboot 工具使用
2.5.1 工具安装与验证
adb 和 fastboot 是 Android 开发的核心调试工具。AOSP 编译后会生成最新版本,也可单独安装:
# 从 AOSP 编译产物中获取
cd ~/aosp
source build/envsetup.sh
lunch aosp_arm64-eng
make adb fastboot
# 或通过系统包管理器安装
sudo apt install -y adb fastboot
# 验证版本
adb version
fastboot --version
2.5.2 adb 常用命令速查
| 命令 | 说明 | Camera 调试场景 |
|---|---|---|
adb devices | 列出已连接的设备 | 确认设备是否被识别 |
adb shell | 进入设备 shell | 查看 Camera 进程、日志 |
adb logcat -s CameraService | 过滤 CameraService 日志 | 跟踪 HAL 调用流程 |
adb push <local> <remote> | 推送文件到设备 | 更新 HAL 库到 /vendor/lib64/ |
adb pull <remote> <local> | 从设备拉取文件 | 获取 crash dump 或日志 |
adb reboot | 重启设备 | 加载新 HAL 库后重启 |
adb root | 以 root 权限重启 adbd | 访问受保护目录 |
adb remount | 重新挂载分区为可写 | 替换系统/vendor 分区文件 |
2.5.3 fastboot 常用命令速查
| 命令 | 说明 | Camera 调试场景 |
|---|---|---|
fastboot devices | 列出 fastboot 模式下的设备 | 确认设备进入 bootloader |
fastboot flash system system.img | 刷写系统分区 | 更新 CameraService 或框架 |
fastboot flash vendor vendor.img | 刷写 vendor 分区 | 更新 Camera HAL 库 |
fastboot boot boot.img | 临时启动指定内核 | 测试内核修改 |
fastboot reboot | 重启设备 | 刷写完成后重启 |
重要提醒:
adb remount 仅在 userdebug 或 eng 版本中可用。生产版本(user)无法 remount,必须通过 fastboot 刷写完整镜像。Camera HAL 开发请始终使用 eng 或 userdebug 版本。
2.5.4 Camera HAL 调试典型工作流
以下是一个典型的 Camera HAL 修改→部署→验证流程:
- 修改 HAL 代码:在
device/或vendor/目录下编辑 Camera HAL 实现。 - 编译模块:
make -j$(nproc) camera.hal - 推送库到设备:
adb push out/target/product/<device>/vendor/lib64/hw/camera.xxx.so /vendor/lib64/hw/ - 重启 CameraService:
adb shell pkill cameraserver或直接重启设备。 - 验证日志:
adb logcat -s CameraService查看 HAL 初始化与调用日志。
2.6 常见问题与避坑指南
| 问题 | 原因 | 解决方案 |
|---|---|---|
repo sync 失败 | 网络不稳定或镜像源不可用 | 使用 --depth=1 浅克隆,或切换镜像源 |
编译报错 No rule to make target | 缺少依赖模块或分支不匹配 | 执行 make clean 后重新 lunch 并编译 |
adb devices 显示 unauthorized | 设备未授权 USB 调试 | 在设备上确认 RSA 指纹授权 |
fastboot flash 失败 | 分区锁或版本不匹配 | 执行 fastboot flashing unlock 解锁 bootloader |
| Camera HAL 库加载失败 | 库路径错误或 SELinux 权限 | 检查 adb shell ls -lZ /vendor/lib64/hw/ 确认上下文 |
环境验证清单:完成本章所有步骤后,请确认以下项目:
✅
✅
✅
✅ 至少成功完成一次
✅ 能够通过 adb 连接设备并执行
✅
repo --version 输出正常✅
java -version 显示 OpenJDK 11+✅
adb version 和 fastboot --version 可用✅ 至少成功完成一次
make -j$(nproc) 全编译✅ 能够通过 adb 连接设备并执行
adb shell