Camera HAL开发从入门到精通 - 第2节

2.1 Linux 开发环境配置

Camera HAL 开发的核心环境基于 Linux 操作系统。推荐使用 Ubuntu 20.04 LTS 或 Ubuntu 22.04 LTS,这两者与 AOSP(Android Open Source Project)的兼容性最好。以下为环境配置的关键步骤。

2.1.1 基础依赖包安装

在干净的 Ubuntu 系统上,首先需要安装编译 Android 源码所需的工具链和库。执行以下命令安装核心依赖:

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 或通过 virtualenv 管理 Python 版本,因为部分 AOSP 旧版本脚本仍依赖 Python 2.7。

2.1.2 Repo 工具与 Git 配置

Repo 是 Google 提供的用于管理多 Git 仓库的工具,是下载 AOSP 源码的必备工具。安装与配置步骤如下:

  1. 安装 Repo: 将 Repo 脚本下载到 ~/bin 目录并赋予执行权限。
  2. 配置 Git 用户信息: 设置 user.name 和 user.email,这是提交代码的必要条件。
  3. 设置文件描述符限制: 编译大型项目时,Linux 默认的文件描述符限制可能不足,需通过 ulimit -n 1024 或修改 /etc/security/limits.conf 进行调整。
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

2.1.3 开发环境验证

完成安装后,可通过以下命令验证环境是否就绪:

验证项 命令 预期输出
GCC 版本 gcc --version gcc (Ubuntu 9.4.0) 或更高
Python 版本 python3 --version Python 3.8.x 或 3.10.x
Repo 版本 repo --version repo 2.x
Git 版本 git --version git 2.25.x 或更高
关键点: 确保 ~/bin 已加入 PATH 环境变量,否则 repo 命令无法被识别。建议将 export PATH=~/bin:$PATH 写入 ~/.bashrc 文件以实现持久化。
Linux 开发环境核心依赖关系 Ubuntu 20.04/22.04 基础工具链 (gcc/make) Repo + Git Python 2/3 libncurses / zlib AOSP 源码管理 OpenJDK 11

2.2 Android 源码下载与编译

AOSP 源码是 Camera HAL 开发的基石。本节将介绍如何选择分支、下载源码以及完成首次编译。

2.2.1 选择 AOSP 分支

不同的 Android 版本对应不同的 API 等级和 HAL 接口。Camera HAL 开发通常选择与目标设备匹配的 长期支持分支 或 最新稳定分支。

Android 版本 API 等级 推荐分支 Camera HAL 版本
Android 12 31 android-12.0.0_r32 HAL3
Android 13 33 android-13.0.0_r41 HAL3 + 扩展
Android 14 34 android-14.0.0_r15 HAL3 + 多摄

2.2.2 下载源码流程

使用 Repo 工具初始化并同步源码。以下以 Android 14 为例:

mkdir ~/aosp
cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15
repo sync -c -j$(nproc --all)
注意: 首次同步源码耗时较长(通常 2-6 小时,取决于网络带宽),建议使用稳定的有线网络连接。如果同步中断,可重复执行 repo sync 继续下载。

2.2.3 编译 AOSP

编译前需加载环境变量并选择编译目标。Camera HAL 开发通常使用 aosp_arm64 或针对特定设备的 aosp_-userdebug 版本。

source build/envsetup.sh
lunch aosp_arm64-userdebug
make -j$(nproc --all)

编译完成后,输出文件位于 out/target/product/generic_arm64/ 目录下,其中 system.img、vendor.img 和 boot.img 是后续烧录的关键镜像。

AOSP 源码下载与编译流程 选择分支 repo init repo sync source + lunch make -jN 耗时 2-6 小时 依赖网络稳定性 选择 userdebug 版本 开启调试权限

2.3 AOSP 开发环境搭建

除了源码编译环境,Camera HAL 开发还需要配置 IDE、调试工具和模拟器环境,以提高开发效率。

2.3.1 IDE 与代码导航

推荐使用 VS Code 或 Android Studio 作为主要 IDE。对于 AOSP 这种大型 C++/Java 混合项目,需要生成代码索引以支持跳转和补全。

  • VS Code: 安装 clangd 插件,并通过 compile_commands.json 提供编译信息。
  • Android Studio: 使用 development/tools/idegen.sh 脚本生成 android.ipr 和 android.iml 文件,然后导入项目。
# 生成 Android Studio 项目文件
cd ~/aosp
source build/envsetup.sh
lunch aosp_arm64-userdebug
make idegen
development/tools/idegen/idegen.sh

2.3.2 模拟器与目标设备

Camera HAL 开发通常需要硬件设备进行验证,但模拟器也可用于初步测试。AOSP 编译完成后,可直接启动模拟器:

emulator -show-kernel -no-snapshot -memory 2048 -cores 4

对于真实设备,需要确保设备已解锁 bootloader 并刷入编译好的镜像。

最佳实践: 在开发初期,建议使用 userdebug 版本编译,该版本保留了 root 权限和调试工具,方便通过 adb 进行 Camera HAL 的日志抓取和参数调试。
AOSP 开发环境架构 Linux 主机 AOSP 源码树 IDE (VS Code/AS) 目标设备 模拟器 (QEMU) 物理设备 (USB) adb / fastboot 通信桥梁

2.4 adb 与 fastboot 工具使用

adb(Android Debug Bridge)和 fastboot 是 Camera HAL 开发中最常用的调试与刷机工具。掌握它们的使用是开发者的基本功。

2.4.1 adb 常用命令

adb 用于在设备运行时进行调试、日志抓取和文件传输。以下是与 Camera HAL 开发密切相关的命令:

命令 用途 Camera HAL 场景
adb devices 列出已连接的设备 确认设备是否被识别
adb logcat -s CameraHal 过滤 Camera HAL 日志 查看 HAL 层调试信息
adb shell dumpsys media.camera 获取 Camera 服务状态 检查 Camera 设备列表和配置
adb push/pull 文件传输 替换 HAL 库或配置文件
adb root 重启 adbd 为 root 权限 获取访问 /vendor 等分区权限

2.4.2 fastboot 刷机流程

当需要刷入新编译的镜像时,fastboot 是主要工具。以下为刷写 Camera HAL 相关分区的标准流程:

  1. 进入 fastboot 模式: 设备关机后,按住音量减 + 电源键,或通过 adb reboot bootloader 命令。
  2. 解锁 bootloader: 执行 fastboot flashing unlock(部分设备需要先获取解锁码)。
  3. 刷写分区: 使用 fastboot flash <partition> <image> 命令刷写 vendor.img(包含 HAL 库)和 boot.img。
  4. 重启设备: 执行 fastboot reboot。
# 刷写 vendor 分区(Camera HAL 库所在分区)
fastboot flash vendor out/target/product/generic_arm64/vendor.img

# 刷写 boot 分区
fastboot flash boot out/target/product/generic_arm64/boot.img

# 重启
fastboot reboot
警告: 刷机操作会清除设备数据,请提前备份。此外,频繁刷写 vendor.img 可能导致设备进入循环重启,建议在刷写前通过 adb shell 确认当前分区状态。
adb 与 fastboot 工作流程 开发主机 adb 命令 fastboot 命令 Android 设备 系统运行态 (adb) Bootloader 模式 日志抓取 / 文件推送 实时调试 刷写 vendor/boot 解锁 bootloader

2.5 环境验证与常见问题

完成上述步骤后,建议进行一个完整的验证流程,确保开发环境可用。

2.5.1 验证清单

  • 编译验证: 执行 make -j4 编译一个小模块(如 make libcameraservice),确认编译系统正常。
  • adb 连接: 连接设备后执行 adb shell,确认可进入设备终端。
  • fastboot 识别: 进入 bootloader 后执行 fastboot devices,确认设备 ID 显示。
  • Camera HAL 日志: 执行 adb logcat -s CameraHal,打开相机应用,确认有 HAL 层日志输出。

2.5.2 常见问题与解决

问题 可能原因 解决方案
repo sync 失败 网络不稳定或磁盘空间不足 使用 repo sync --force-sync 重试;确保磁盘剩余空间 > 100GB
编译报错 missing libncurses 依赖包未安装 执行 sudo apt install libncurses5
adb devices 显示 unauthorized 设备未授权调试 在设备上确认 RSA 指纹授权
fastboot flash 失败 分区锁定或镜像不匹配 执行 fastboot flashing unlock;检查镜像是否针对当前设备编译
效率建议: 将常用的 adb 和 fastboot 命令封装为 shell 脚本(如 flash_vendor.sh),避免重复输入长命令。同时,建议在 ~/.bashrc 中设置 alias 简化操作,例如 alias adb-log-cam='adb logcat -s CameraHal'。