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。
AOSP 开发环境搭建流程 Ubuntu 系统配置 Android 源码下载 AOSP 编译环境 adb / fastboot 关键说明 • 推荐使用 Ubuntu 20.04 LTS,与 AOSP 官方 CI 环境一致。 • 源码下载建议使用 repo 工具,分支选择 android-13.0.0_r41 或更高。 • 编译产物约 80-120GB,请确保磁盘有足够空间。 • adb 和 fastboot 是 Camera HAL 调试的“双手”,必须熟练使用。

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 等核心工具源码低
AOSP 源码关键目录(Camera 视角) AOSP 根目录 frameworks/av hardware/interfaces device/ vendor/ Camera HAL 实现通常位于 device/ 或 vendor/ 目录下,具体取决于厂商架构。 HAL 接口定义在 hardware/interfaces/camera/ 中。

2.4 AOSP 编译环境搭建

2.4.1 初始化编译环境

每次编译前需要加载 AOSP 的环境变量和函数:

cd ~/aosp
source build/envsetup.sh
lunch  # 选择目标设备,例如 aosp_arm64-eng

lunch 命令会列出所有可用的编译目标。对于 Camera HAL 开发,常用目标:

目标名称架构用途
aosp_arm64-engARM64模拟器或通用 ARM64 设备
aosp_x86_64-engx86_64模拟器(x86 架构)
aosp_blueline-engARM64Pixel 3 真机调试
aosp_coral-engARM64Pixel 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 分析
编译流程与产物关系 source build/envsetup.sh lunch make -jN out/target/product/… 编译产物中,vendor.img 包含 Camera HAL 实现库(如 camera.xxx.so), system.img 包含 CameraService 和框架层代码。

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 修改→部署→验证流程:

  1. 修改 HAL 代码:在 device/ 或 vendor/ 目录下编辑 Camera HAL 实现。
  2. 编译模块:make -j$(nproc) camera.hal
  3. 推送库到设备:adb push out/target/product/<device>/vendor/lib64/hw/camera.xxx.so /vendor/lib64/hw/
  4. 重启 CameraService:adb shell pkill cameraserver 或直接重启设备。
  5. 验证日志:adb logcat -s CameraService 查看 HAL 初始化与调用日志。
Camera HAL 调试工作流 修改 HAL 代码 make camera.hal adb push pkill cameraserver logcat 验证 调试要点 • 使用 adb root 获取 root 权限后再执行 push 和 remount。 • 如果 pkill cameraserver 无效,使用 adb reboot 完全重启。 • 日志过滤建议:adb logcat -s CameraService:CameraHal:Hal3

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/ 确认上下文
环境验证清单:完成本章所有步骤后,请确认以下项目:
✅ repo --version 输出正常
✅ java -version 显示 OpenJDK 11+
✅ adb version 和 fastboot --version 可用
✅ 至少成功完成一次 make -j$(nproc) 全编译
✅ 能够通过 adb 连接设备并执行 adb shell