3. 开发环境搭建:交叉编译工具链配置、Android源码编译环境、adb与fastboot工具准备
嵌入式平台Camera HAL层的调试,离不开一套完整且正确的开发环境。本章将系统讲解交叉编译工具链的配置、Android源码编译环境的搭建,以及adb与fastboot两大核心工具的准备工作。这些是后续所有调试工作的基础,任何环节的缺失或配置错误,都会导致调试流程中断。
3.1 交叉编译工具链配置
嵌入式设备(如ARM、AArch64架构)资源有限,无法直接在目标板上运行编译器。因此,需要在性能强大的宿主机(x86_64)上安装交叉编译工具链,生成目标架构的可执行文件。
3.1.1 工具链选择与安装
根据目标平台架构,选择对应的GCC交叉编译工具链。常见选择如下:
| 目标架构 | 工具链前缀 | 典型包名(Ubuntu 20.04+) | 适用场景 |
|---|---|---|---|
| ARM 32-bit (armv7l) | arm-linux-gnueabihf- | gcc-arm-linux-gnueabihf | 老旧嵌入式设备、部分IoT平台 |
| AArch64 (armv8-a) | aarch64-linux-gnu- | gcc-aarch64-linux-gnu | 主流Android设备、树莓派4/5 |
| Android NDK | aarch64-linux-android- | android-ndk (手动安装) | Android HAL层动态库编译 |
安装步骤(以AArch64为例):
# 更新包索引
sudo apt update
# 安装AArch64交叉编译工具链
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# 验证安装
aarch64-linux-gnu-gcc --version
3.1.2 工具链验证与测试
编写一个简单的C程序,交叉编译并在目标板上运行,验证工具链正确性。
// hello_hal.c
#include <stdio.h>
int main() {
printf("Camera HAL Debug Toolchain OK!\n");
return 0;
}
# 交叉编译
aarch64-linux-gnu-gcc -o hello_hal hello_hal.c -static
# 查看生成文件的架构
file hello_hal
# 输出示例: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked
# 将文件push到目标板并执行
adb push hello_hal /data/local/tmp/
adb shell chmod +x /data/local/tmp/hello_hal
adb shell /data/local/tmp/hello_hal
-static 参数进行静态编译。否则运行时会出现 No such file or directory 错误。
3.2 Android源码编译环境搭建
Camera HAL层调试通常需要修改HAL代码并重新编译生成动态库(如 camera.xxx.so)。因此,一套完整的Android源码编译环境是必不可少的。
3.2.1 环境依赖与Repo工具
Android源码使用Repo工具管理多个Git仓库。首先安装必要依赖:
# 安装基础依赖
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
# 安装 Repo 工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin
3.2.2 源码下载与分支选择
根据目标设备的Android版本,选择对应的AOSP分支。常见对应关系:
| Android版本 | API Level | 推荐AOSP分支 | 典型设备 |
|---|---|---|---|
| Android 12 | 31 | android-12.0.0_r34 | Pixel 6 / 通用嵌入式平台 |
| Android 13 | 33 | android-13.0.0_r74 | Pixel 7 / 最新嵌入式平台 |
| Android 14 | 34 | android-14.0.0_r15 | Pixel 8 / 开发中平台 |
# 初始化源码目录(以Android 13为例)
mkdir ~/aosp13
cd ~/aosp13
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r74
# 同步源码(耗时较长,建议使用 -j4 或 -j8)
repo sync -j8
hardware/interfaces/camera/ 和 hardware/qcom/camera/(高通平台)或 hardware/rockchip/camera/(瑞芯微平台)。调试时主要修改这些目录下的文件。
3.2.3 编译环境初始化与单模块编译
Android源码编译需要先加载环境变量,然后使用mmm或make进行单模块编译。
# 加载编译环境
source build/envsetup.sh
# 选择目标设备(以aosp_arm64为例)
lunch aosp_arm64-userdebug
# 单模块编译Camera HAL(以通用HAL为例)
mmm hardware/interfaces/camera/
# 或者编译所有Camera相关模块
make camera.hal -j8
编译生成的动态库位于 out/target/product/generic_arm64/vendor/lib64/hw/ 或 out/target/product/generic_arm64/system/lib64/hw/ 下。
mmm 或 make 模块名 进行增量编译,可以大幅节省时间。编译完成后,使用 adb sync 或手动 adb push 将新生成的 .so 文件推送到设备。
3.3 adb与fastboot工具准备
adb(Android Debug Bridge)和fastboot是嵌入式Camera HAL调试中最常用的两个工具。adb用于运行时调试、日志抓取、文件传输;fastboot用于刷写分区、恢复系统。
3.3.1 adb工具安装与配置
adb工具可以通过Android SDK Platform Tools或系统包管理器安装。
# 方法一:通过apt安装(版本可能较旧)
sudo apt install -y adb fastboot
# 方法二:下载最新Platform Tools(推荐)
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
unzip platform-tools-latest-linux.zip
sudo cp platform-tools/adb /usr/local/bin/
sudo cp platform-tools/fastboot /usr/local/bin/
# 配置USB权限(避免adb devices无权限)
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
# 验证连接
adb devices
3.3.2 adb常用调试命令速查
在Camera HAL调试中,以下adb命令使用频率最高:
| 命令 | 用途 | Camera调试场景 |
|---|---|---|
adb logcat -s CameraHal |
过滤Camera HAL层日志 | 查看HAL层错误、调试信息 |
adb shell dmesg | grep camera |
查看内核驱动日志 | 检查Sensor上电、I2C通信 |
adb push local.so /vendor/lib64/hw/ |
推送编译好的HAL库 | 替换Camera HAL动态库 |
adb shell chmod 644 /vendor/lib64/hw/camera.xxx.so |
修改文件权限 | 确保HAL库可读 |
adb shell stop; adb shell start |
重启Android服务 | 重新加载HAL库 |
adb shell ls -lZ /vendor/lib64/hw/ |
查看SELinux上下文 | 排查权限拒绝问题 |
3.3.3 fastboot刷写分区
当HAL库修改导致系统无法启动,或需要刷写完整vendor分区时,使用fastboot模式:
# 进入fastboot模式(设备关机状态下按住音量减+电源)
adb reboot bootloader
# 查看设备是否识别
fastboot devices
# 刷写vendor分区(包含Camera HAL库)
fastboot flash vendor vendor.img
# 刷写boot分区(内核)
fastboot flash boot boot.img
# 重启设备
fastboot reboot
adb logcat -b all -s CameraHal 抓取所有缓冲区的HAL日志。很多HAL层崩溃问题在常规logcat中看不到,但在kernel和events缓冲区中有明确记录。
3.4 环境验证清单
完成上述所有配置后,使用以下清单逐项验证,确保环境就绪:
| 验证项 | 验证命令 | 预期结果 |
|---|---|---|
| 交叉编译工具链 | aarch64-linux-gnu-gcc --version |
显示版本号,无报错 |
| 交叉编译测试 | file hello_hal |
显示 ELF 64-bit LSB executable, ARM aarch64 |
| Android源码环境 | source build/envsetup.sh && lunch |
成功加载,显示菜单 |
| adb连接 | adb devices |
显示设备序列号,状态为 device |
| fastboot连接 | fastboot devices |
显示设备序列号 |
| logcat可用 | adb logcat -c && adb logcat -s CameraHal -t 5 |
清空日志后输出最近5行Camera日志 |