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
提示: 如果目标平台是Android系统,强烈建议直接使用Android NDK提供的独立工具链。NDK工具链与Android Bionic libc、linker完全兼容,避免glibc与bionic之间的ABI冲突。

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 错误。
交叉编译工具链工作流程 宿主机 (x86_64) Ubuntu 20.04 / 22.04 交叉编译工具链 aarch64-linux-gnu-gcc 目标板 (AArch64) Android / Linux 编译产物 .so / .ko / 可执行文件 传输方式 adb push / scp / NFS

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
关键点: Camera HAL源码位于 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/ 下。

注意: 如果只修改了HAL层代码,不需要完整编译整个系统。使用 mmm 或 make 模块名 进行增量编译,可以大幅节省时间。编译完成后,使用 adb sync 或手动 adb push 将新生成的 .so 文件推送到设备。
Android源码编译流程(Camera HAL模块) repo sync 同步源码 source build/envsetup.sh lunch aosp_arm64-userdebug mmm hardware/interfaces/camera/ out/.../hw/camera.xxx.so 增量编译建议 只修改HAL代码时 使用 mmm 避免全编译 编译时间缩短 80%

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
经验之谈: 在Camera HAL调试初期,建议频繁使用 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日志