You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建特定版本GKI内核及适配的内核模块?

构建特定版本GKI内核与适配模块指南

一、构建特定版本的GKI内核

  • 获取对应版本的GKI源码
    每个Android版本对应固定的GKI内核分支,比如Android 13对应5.10、Android 14对应5.15。用repo工具同步指定分支:
    repo init -u https://android.googlesource.com/kernel/manifest -b android14-5.15
    repo sync
    
    若要精准字节级匹配,建议同步官方标记的tag分支,而非默认主分支。
  • 配置构建环境
    必须使用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一致性:
    make gki_defconfig
    
    禁止修改任何配置项,否则会破坏ABI兼容性。
  • 执行构建
    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:

  1. 提前将对应版本的GKI头文件和Module.symvers放入固定目录(如/opt/android/gki-headers/、/opt/android/gki-symvers/)。
  2. 编写通用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
    
  3. 直接执行make即可完成模块构建。

内容的提问来源于stack exchange,提问作者jktrx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:32:07