如何构建特定版本GKI内核及适配的内核模块?
构建特定版本GKI内核与适配模块指南
一、构建特定版本的GKI内核
- 获取对应版本的GKI源码
每个Android版本对应固定的GKI内核分支,比如Android 13对应5.10、Android 14对应5.15。用repo工具同步指定分支:
若要精准字节级匹配,建议同步官方标记的tag分支,而非默认主分支。repo init -u https://android.googlesource.com/kernel/manifest -b android14-5.15 repo sync - 配置构建环境
必须使用Android官方指定的工具链(如NDK r25b对应Android 14),不能用系统自带gcc:export PATH=$PATH:/path/to/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/bin export ARCH=arm64 # 根据目标架构调整,如x86_64 export CROSS_COMPILE=aarch64-linux-android- export LLVM=1 # 启用LLVM构建链 - 加载官方GKI配置
加载通用GKI defconfig,确保ABI一致性:
禁止修改任何配置项,否则会破坏ABI兼容性。make gki_defconfig - 执行构建
构建完成后,内核镜像位于make -j$(nproc)arch/arm64/boot/Image.gz,模块生成在对应源码目录下。
二、构建适配特定GKI内核的独立模块
方法1:基于GKI源码树构建(推荐,ABI完全匹配)
- 将模块源码放入GKI源码的
drivers/或自定义modules/目录。 - 修改对应目录的Kconfig,添加模块配置:
config MY_CUSTOM_MODULE tristate "My Custom Module" default m - 修改目录下的Makefile:
obj-$(CONFIG_MY_CUSTOM_MODULE) += my_custom_module.o - 启用模块并构建:
make gki_defconfig menuconfig # 找到模块并设为M make -j$(nproc) modules
方法2:独立构建模块(无需完整内核源码)
- 提前获取对应GKI版本的内核头文件包和Module.symvers文件(后者由GKI内核构建生成,包含符号CRC校验)。
- 编写模块Makefile:
obj-m += my_custom_module.o KERNELDIR := /path/to/gki-headers MODULE_SYMVERS := /path/to/Module.symvers ARCH := arm64 CROSS_COMPILE := aarch64-linux-android- LLVM := 1 all: make -C $(KERNELDIR) M=$(PWD) modules MODULE_SYMVERS=$(MODULE_SYMVERS) clean: make -C $(KERNELDIR) M=$(PWD) clean - 执行
make即可完成构建,需确保头文件和Module.symvers与目标GKI完全匹配。
三、实现字节级一致的构建重现
需严格控制以下变量:
- 源码版本:同步官方标记的tag分支,避免使用未稳定的HEAD提交。
- 工具链版本:使用对应Android版本官方指定的NDK/工具链,版本号完全匹配。
- 构建环境:使用与官方一致的操作系统(如Ubuntu 22.04),设置
LANG=C.UTF-8避免编码影响,关闭自定义编译环境变量。 - 构建命令:严格执行官方流程,不添加额外编译参数(如
O=自定义输出目录)。
四、快速构建适配GKI的内核模块(类传统Linux模块构建)
复用通用Makefile实现一键构建,效果类似make -C/lib/modules/$(uname -r) M=$PWD:
- 提前将对应版本的GKI头文件和Module.symvers放入固定目录(如
/opt/android/gki-headers/、/opt/android/gki-symvers/)。 - 编写通用Makefile并放入模块源码目录:
obj-m := $(notdir $(CURDIR)).o # 自动匹配当前内核版本的头文件与symvers KERNEL_VER := $(shell uname -r | cut -d'-' -f1-2) KERNEL_HEADERS := /opt/android/gki-headers/$(KERNEL_VER) MODULE_SYMVERS := /opt/android/gki-symvers/$(KERNEL_VER)/Module.symvers # 自动识别架构 ARCH := $(shell uname -m | sed 's/aarch64/arm64/;s/x86_64/x86/') CROSS_COMPILE := $(if $(filter arm64,$(ARCH)),aarch64-linux-android-,x86_64-linux-android-) LLVM := 1 all: make -C $(KERNEL_HEADERS) M=$(PWD) modules MODULE_SYMVERS=$(MODULE_SYMVERS) clean: make -C $(KERNEL_HEADERS) M=$(PWD) clean - 直接执行
make即可完成模块构建。
内容的提问来源于stack exchange,提问作者jktrx
相关产品推荐
相关产品推荐

