3. 配置内核编译环境
任务说明
本案例面向Android SoC BSP开发中的内核编译环境搭建环节。目标是从SoC厂商获取内核源码,配置正确的交叉编译工具链,并完成内核镜像的编译。以高通MSM8916平台为例,内核源码版本为3.10,使用AArch32(32位ARM)交叉工具链。
环境准备
宿主机要求:Ubuntu 18.04/20.04 x86_64,已安装git、make、gcc、libncurses5-dev等基础包。Android NDK r14b或独立工具链均可,本案例使用Linaro GCC 4.9工具链,路径为/opt/toolchains/gcc-arm-linux-gnueabihf-4.9。
关键完整代码
#!/bin/bash
# build_kernel.sh - MSM8916内核编译脚本
set -e
# ---------- 1. 配置变量 ----------
KERNEL_SRC="$HOME/msm8916-kernel"
TOOLCHAIN_PREFIX="/opt/toolchains/gcc-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-"
JOBS=$(nproc)
# ---------- 2. 获取内核源码 ----------
if [ ! -d "$KERNEL_SRC" ]; then
git clone --depth 1 -b msm8916 \
https://github.com/LineageOS/android_kernel_wingtech_wt88047.git \
"$KERNEL_SRC"
fi
cd "$KERNEL_SRC"
# ---------- 3. 设置交叉编译环境 ----------
export ARCH=arm
export CROSS_COMPILE="$TOOLCHAIN_PREFIX"
export PATH="/opt/toolchains/gcc-arm-linux-gnueabihf-4.9/bin:$PATH"
# 验证工具链
if ! command -v ${CROSS_COMPILE}gcc > /dev/null; then
echo "错误: 未找到交叉编译器 ${CROSS_COMPILE}gcc"
exit 1
fi
${CROSS_COMPILE}gcc --version | head -1
# ---------- 4. 清理并生成默认配置 ----------
make distclean
# 使用厂商预置defconfig(若存在)
if [ -f "arch/arm/configs/msm8916_defconfig" ]; then
make msm8916_defconfig
else
# 回退:使用高通基准配置
make msm8916-perf_defconfig
fi
# ---------- 5. 编译内核 ----------
make -j"$JOBS" zImage
# ---------- 6. 输出检查 ----------
if [ -f "arch/arm/boot/zImage" ]; then
echo "编译成功: arch/arm/boot/zImage"
ls -lh arch/arm/boot/zImage
else
echo "编译失败: zImage未生成"
exit 1
fi
运行方式
- 安装工具链:将Linaro GCC 4.9解压至
/opt/toolchains/,确认arm-linux-gnueabihf-gcc可执行。 - 赋予脚本执行权限并运行:
chmod +x build_kernel.sh && ./build_kernel.sh - 首次运行会自动克隆源码(约1GB),后续运行直接复用本地目录。
验证方法
- 工具链验证:脚本第3步会打印交叉编译器版本,应显示
gcc version 4.9.x。 - 编译产物:最终在
arch/arm/boot/下生成zImage文件,大小约5~8MB。 - 通过条件:脚本退出码为0,且输出“编译成功: arch/arm/boot/zImage”即判定通过。
常见问题
- 头文件缺失:若报
elf.h或ncurses.h缺失,执行sudo apt install libelf-dev libncurses5-dev。 - 工具链不匹配:若编译中段报
unknown type name 'u64'等类型错误,说明CROSS_COMPILE未生效,检查脚本中export语句是否被覆盖。 - defconfig不存在:部分厂商分支使用不同命名,可先执行
make help查看可用配置列表,选择对应目标。