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
python2 或通过 virtualenv 管理 Python 版本,因为部分 AOSP 旧版本脚本仍依赖 Python 2.7。
2.1.2 Repo 工具与 Git 配置
Repo 是 Google 提供的用于管理多 Git 仓库的工具,是下载 AOSP 源码的必备工具。安装与配置步骤如下:
- 安装 Repo: 将 Repo 脚本下载到
~/bin目录并赋予执行权限。 - 配置 Git 用户信息: 设置
user.name和user.email,这是提交代码的必要条件。 - 设置文件描述符限制: 编译大型项目时,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 文件以实现持久化。
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)
repo sync 继续下载。
2.2.3 编译 AOSP
编译前需加载环境变量并选择编译目标。Camera HAL 开发通常使用 aosp_arm64 或针对特定设备的 aosp_ 版本。
source build/envsetup.sh
lunch aosp_arm64-userdebug
make -j$(nproc --all)
编译完成后,输出文件位于 out/target/product/generic_arm64/ 目录下,其中 system.img、vendor.img 和 boot.img 是后续烧录的关键镜像。
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 的日志抓取和参数调试。
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 相关分区的标准流程:
- 进入 fastboot 模式: 设备关机后,按住音量减 + 电源键,或通过
adb reboot bootloader命令。 - 解锁 bootloader: 执行
fastboot flashing unlock(部分设备需要先获取解锁码)。 - 刷写分区: 使用
fastboot flash <partition> <image>命令刷写vendor.img(包含 HAL 库)和boot.img。 - 重启设备: 执行
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 确认当前分区状态。
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;检查镜像是否针对当前设备编译 |
flash_vendor.sh),避免重复输入长命令。同时,建议在 ~/.bashrc 中设置 alias 简化操作,例如 alias adb-log-cam='adb logcat -s CameraHal'。