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库的编译链路,以及交叉工具链在其中的位置:
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源码的编译与集成。