Android编译系统参考手册
http://android.cloudchou.com/build/core/tasks/kernel.php
build/core/tasks/kernel.mk
定义生成内核的规则
TARGET_AUTO_KDIR
TARGET_AUTO_KDIR := (TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g')
自动设置的内核目录
比如i9100,那么自动设置的内核目录是
kernel/samsung/i9100
TARGET_KERNEL_SOURCE
TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR)
内核源码目录
默认 kernel//
一般在BoardConfig.mk里配置
KERNEL_SRC
KERNEL_SRC := $(TARGET_KERNEL_SOURCE)
内核源码目录
KERNEL_DEFCONFIG
KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG)
编译内核用的配置文件
一般在BoardConfig.mk里配置
VARIANT_DEFCONFIG
VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG)
变量配置
一般在BoardConfig.mk里配置
TARGET_KERNEL_SELINUX_CONFIG
selinux配置
一般在BoardConfig.mk里配置
KERNEL_OUT
KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ
示例:
out/target/product/i9100/obj/KERNEL_OBJ
KERNEL_CONFIG
生成的编译内核的配置文件
KERNEL_CONFIG := $(KERNEL_OUT)/.config
示例:
out/target/product/i9100/obj/KERNEL_OBJ/.config
BOARD_USES_UBOOT
是否启用uboot
一般在BoardConfig.mk里配置
BOARD_USES_UNCOMPRESSED_BOOT
是否启用无压缩的boot
一般在BoardConfig.mk里配置
TARGET_PREBUILT_INT_KERNEL
ifeq ((KERNEL_OUT)/arch/(BOARD_USES_UNCOMPRESSED_BOOT),true)
TARGET_PREBUILT_INT_KERNEL := (TARGET_ARCH)/boot/Image
TARGET_PREBUILT_INT_KERNEL_TYPE := Image
else
TARGET_PREBUILT_INT_KERNEL := (TARGET_ARCH)/boot/zImage
TARGET_PREBUILT_INT_KERNEL_TYPE := zImage
endif
示例:
out/target/product/i9100/obj/KERNEL_OBJ/arch/arm/boot/zImage
TARGET_PREBUILT_INT_KERNEL_TYPE
见TARGET_PREBUILT_INT_KERNEL
TARGET_PREBUILT_KERNEL
预编译的内核
一般在BoardConfig.mk里配置
在Recovery适配时经常需要设置该项
示例:
TARGET_PREBUILT_KERNEL := $(LOCAL_DIR)/kernel
HAS_PREBUILT_KERNEL
是否有预编译的内核
NEEDS_KERNEL_COPY
是否需要拷贝内核
FULL_KERNEL_BUILD
是否需要编译内核源代码
KERNEL_BIN
内核文件
ifeq "(KERNEL_SRC) )" ""
ifneq ((TARGET_PREBUILT_KERNEL)
endif
else
ifeq ((TARGET_USES_UNCOMPRESSED_KERNEL),true)
KERNEL_BIN := (TARGET_PREBUILT_INT_KERNEL)
endif
endif
endif
示例:
out/target/product/i9100/obj/KERNEL_OBJ/arch/arm/boot/zImage
KERNEL_HEADERS_INSTALL
KERNEL_HEADERS_INSTALL := $(KERNEL_OUT)/usr
示例:
out/target/product/i9100/obj/KERNEL_OBJ/usr
KERNEL_MODULES_INSTALL
KERNEL_MODULES_INSTALL := system
内核模块的安装目录
KERNEL_MODULES_OUT
KERNEL_MODULES_OUT := $(TARGET_OUT)/lib/modules
内核模块的的实际安装目录
out/target/product/i9100/system/lib/modules
Function: mv-modules
移动模块
在system/lib/modules找到modules.order文件,
然后找到该文件所在目录下的kernel目录的ko模块文件
对这些文件用arm-eabi-strip进行strip处理
然后将其移至system/lib/modules
Function: clean-module-folder
在system/lib/modules找到modules.order文件
然后删除该文件所在的目录
ccache
ccache程序
ifneq ((strip (ANDROID_BUILD_TOP)/prebuilts/misc/(ANDROID_BUILD_TOP)/prebuilts/misc/(strip (ANDROID_BUILD_TOP)/prebuilts/misc/(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache
endif
endif
endif
ARM_CROSS_COMPILE
交叉编译工具链所在目录
ifneq ((HOST_OS),darwin)
ARM_CROSS_COMPILE:=CROSS_COMPILE="(ANDROID_BUILD_TOP)/prebuilt/darwin-x86/toolchain/(ccache) (TARGET_KERNEL_CUSTOM_TOOLCHAIN)/bin/arm-eabi-"
endif
else
ARM_CROSS_COMPILE:=CROSS_COMPILE="(ARM_EABI_TOOLCHAIN)/arm-eabi-"
endif
MAKE_FLAGS
ifeq ((ANDROID_BUILD_TOP)/external/elfutils/libelf
endif
TARGET_KERNEL_MODULES
ifeq ($(TARGET_KERNEL_MODULES),)
TARGET_KERNEL_MODULES := no-external-modules
endif
Target: $(KERNEL_OUT)
创建$(KERNEL_OUT)目录
即目录out/target/product/i9100/obj/KERNEL_OBJ
Target: $(KERNEL_CONFIG)
生成编译内核源代码用的配置文件
(KERNEL_OUT)
(MAKE_FLAGS) -C (KERNEL_OUT) ARCH=(ARM_CROSS_COMPILE) VARIANT_DEFCONFIG=(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG)
Target: $(KERNEL_OUT)/piggy
生成piggy内核
(TARGET_PREBUILT_INT_KERNEL)
(KERNEL_OUT)/arch/(KERNEL_OUT)/piggy
TARGET_KERNEL_BINARIES
生成内核,并安装好模块
TARGET_KERNEL_BINARIES: (KERNEL_CONFIG) (MAKE) (KERNEL_SRC) O=(TARGET_ARCH) (TARGET_PREBUILT_INT_KERNEL_TYPE)
#生成模块
-(MAKE_FLAGS) -C (KERNEL_OUT) ARCH=(ARM_CROSS_COMPILE) modules
#安装模块至system/lib/modules目录,但是还需strip处理
-(MAKE_FLAGS) -C (KERNEL_OUT) INSTALL_MOD_PATH=../../(TARGET_ARCH) (mv-modules)
$(clean-module-folder)
Target: $(TARGET_PREBUILT_INT_KERNEL)
安装模块,并清除先前不用的模块所在目录
ALL_PREBUILT
ALL_PREBUILT += (file) : (ACP)(INSTALLED_KERNEL_TARGET)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通