4. 开发环境搭建(三):搭建Chrome OS / Linux Kernel编译环境、交叉编译工具链配置(aarch64-linux-android-)

在Camera HAL开发中,Kernel层驱动与HAL层库的编译依赖两套独立但互相关联的环境:Chrome OS / Linux Kernel编译环境用于生成内核模块与设备树,交叉编译工具链(aarch64-linux-android-)用于编译HAL用户态库。本章节将分步搭建这两套环境,并验证工具链可用性。

4.1 整体编译架构

下图展示了Camera HAL开发中Kernel与HAL库的编译链路,以及交叉工具链在其中的位置:

Camera HAL 编译架构总览 主机开发环境 (x86_64) aarch64-linux-android- 工具链 Linux Kernel 源码 Camera HAL 源码 vmlinux / .ko / dtb camera HAL .so Android 目标设备 (aarch64) 说明: 1. 内核编译使用主机 gcc + 交叉工具链 2. HAL 编译仅使用 aarch64 工具链 3. 最终产物均部署到目标设备

4.2 搭建Chrome OS / Linux Kernel编译环境

Kernel编译环境的核心依赖包括:交叉编译器、内核源码树、构建工具(make、flex、bison、libelf-dev等)。以下步骤基于Ubuntu 20.04/22.04 LTS。

4.2.1 安装系统依赖包

sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  libncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev \
  libgl1-mesa-dev libxml2-utils xsltproc unzip libelf-dev \
  libssl-dev bc python3 python3-pip cpio
提示:如果编译Chrome OS内核,还需要安装dev-util/ccache和sys-devel/crossdev,用于加速重复编译。

4.2.2 获取内核源码

根据目标平台选择对应的内核分支:

平台 内核仓库 推荐分支
Chrome OS (x86_64) chromiumos/third_party/kernel chromeos-5.15
Chrome OS (ARM64) chromiumos/third_party/kernel chromeos-5.15-arm64
Android GKI android/kernel/common android13-5.15
上游Linux torvalds/linux v6.1
# 以Chrome OS ARM64内核为例
git clone --depth=1 -b chromeos-5.15-arm64 \
  https://chromium.googlesource.com/chromiumos/third_party/kernel \
  chromeos-kernel-5.15
cd chromeos-kernel-5.15

4.2.3 配置内核

使用默认的chromeos配置作为基础,然后针对Camera HAL需求调整:

# 加载Chrome OS默认配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- \
  chromeos_defconfig

# 通过menuconfig微调(可选)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- menuconfig
关键配置项:
  • CONFIG_MEDIA_SUPPORT=y —— 媒体框架支持
  • CONFIG_V4L2=y —— V4L2核心
  • CONFIG_VIDEO_OV5640=y —— 示例Camera传感器驱动(按实际硬件选择)
  • CONFIG_VIDEOBUF2_DMA_CONTIG=y —— DMA连续内存分配器

4.3 交叉编译工具链配置(aarch64-linux-android-)

Android NDK提供的独立工具链是编译Camera HAL的首选方案,它包含clang编译器、lld链接器以及sysroot(系统头文件与库)。

4.3.1 下载NDK并提取工具链

# 下载NDK r25c(推荐)
wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip
unzip android-ndk-r25c-linux.zip

# 使用NDK内置脚本生成独立工具链
cd android-ndk-r25c
./build/tools/make_standalone_toolchain.py \
  --arch arm64 \
  --api 31 \
  --install-dir /opt/aarch64-linux-android-toolchain

生成的工具链目录结构如下:

/opt/aarch64-linux-android-toolchain/
├── bin/
│   ├── aarch64-linux-android-clang
│   ├── aarch64-linux-android-clang++
│   ├── aarch64-linux-android-ld
│   ├── aarch64-linux-android-ar
│   └── ...
├── sysroot/
│   └── usr/
│       ├── include/
│       └── lib/
└── lib/
    └── clang/

4.3.2 验证工具链

编写一个简单的C程序测试编译:

cat > hello_camera.c << 'EOF'
#include <stdio.h>
#include <linux/videodev2.h>

int main() {
    printf("Camera HAL toolchain OK\n");
    printf("V4L2 version: %d.%d.%d\n",
           (LINUX_VERSION_CODE >> 16) & 0xFF,
           (LINUX_VERSION_CODE >> 8) & 0xFF,
           LINUX_VERSION_CODE & 0xFF);
    return 0;
}
EOF

/opt/aarch64-linux-android-toolchain/bin/aarch64-linux-android-clang \
  -o hello_camera hello_camera.c

file hello_camera
# 输出: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV)
常见问题:如果编译时提示找不到linux/videodev2.h,说明sysroot中缺少内核头文件。需要将内核源码中的include/uapi目录复制到工具链的sysroot下:
cp -r /path/to/kernel/include/uapi/linux \
  /opt/aarch64-linux-android-toolchain/sysroot/usr/include/linux

4.4 环境变量与构建脚本

为简化后续编译,建议将工具链路径加入环境变量,并编写统一的构建脚本:

# 添加到 ~/.bashrc 或 ~/.zshrc
export TOOLCHAIN=/opt/aarch64-linux-android-toolchain
export PATH=$TOOLCHAIN/bin:$PATH
export CROSS_COMPILE=aarch64-linux-android-
export ARCH=arm64
export CC=${CROSS_COMPILE}clang
export LD=${CROSS_COMPILE}ld
export AR=${CROSS_COMPILE}ar

内核编译示例脚本 build_kernel.sh:

#!/bin/bash
set -e

KERNEL_DIR=~/chromeos-kernel-5.15
OUT_DIR=~/kernel_out

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-

cd $KERNEL_DIR

# 清理
make O=$OUT_DIR clean

# 配置
make O=$OUT_DIR chromeos_defconfig

# 编译内核与模块
make -j$(nproc) O=$OUT_DIR Image.gz modules dtbs

echo "Kernel build complete: $OUT_DIR/arch/arm64/boot/Image.gz"

4.5 编译验证清单

验证项 命令/方法 预期结果
工具链可执行 aarch64-linux-android-clang --version 显示clang版本信息
内核配置加载 make ARCH=arm64 chromeos_defconfig 生成 .config 文件
内核编译 make -j4 Image.gz 生成 arch/arm64/boot/Image.gz
模块编译 make modules 生成 .ko 文件
设备树编译 make dtbs 生成 .dtb 文件
HAL交叉编译 ${CC} -o test test.c 生成aarch64 ELF文件
最佳实践:建议将工具链和内核源码放在/opt或/workspace目录下,避免路径过长导致编译错误。同时使用ccache加速重复编译:
export CC="ccache aarch64-linux-android-clang"

4.6 常见问题与排查

  • 错误:aarch64-linux-android-clang: command not found
    解决:检查PATH是否包含工具链bin目录,或使用绝对路径。
  • 错误:fatal error: 'linux/videodev2.h' file not found
    解决:将内核uapi头文件复制到sysroot,或使用-I指定内核头文件路径。
  • 错误:ld: cannot find -lc
    解决:确认工具链的sysroot/usr/lib目录下存在libc.a或libc.so,必要时重新生成工具链。
  • 错误:Kernel: arch/arm64/boot/Image.gz is too big
    解决:减少内核模块数量,或启用CONFIG_KERNEL_GZIP以外的压缩算法。

完成以上步骤后,Kernel编译环境与交叉工具链即搭建完毕。下一阶段将基于此环境进行Camera HAL源码的编译与集成。