Android kernel build from source code and from prebuilt

本文详细介绍了如何在AOSP中添加新产品并构建内核,特别是针对HTC flounder设备在Nougat上的不同配置。通过定义vendorsetup.sh、PRODUCT_MAKEFILES,执行'lunch'命令,选择不同的KERNEL_SRC_DIR或TARGET_PREBUILT_KERNEL来决定是构建源码还是预编译内核。关键步骤包括BoardConfig.mk和AndroidBoard.mk的配置,以及AndroidKernel.mk中的源码和预编译选项。

When building android project, we can use prebuilt linux kernel or kernel source code.

About how to add new product in AOSP and android build steps,please refer to Android build tips andAndroid Makefile 具体是 如何识别 TARGET_PRODUCT 变量

I want to use an example to elaborate the build step of a product and how to build kernel.

Example: Add a new flounder device on Nougat. Htc/flounder is already on Nougat, but I want to use different configuration to build it. So I define a new flounder product and add different configurations.

1. Define vendorsetup.sh (device/company/tablet/products/vendorsetup.sh)-------------use print_lunch_menu command to check

add_lunch_combo firetab_flounder-userdebug

2. Define PRODUCT_MAKEFILES in device/company/tablet/products/flounder/AndroidProducts.mk

9PRODUCT_MAKEFILES := \
10        $(LOCAL_DIR)/firetab_flounder.mk

3. When executing "lunch firetab_flounder-userdebug" command, build system will searching firetab_flounder.mk and execute it.    ----use "make dump-products" to check

In this file, you can define KERNEL_SRC_DIR to provide kernel source code path if you want to build kernel from source code.

You can also define TARGET_PREBUILT_KERNEL to provider prebuilt kernel path if you want to build kernel from prebuilt binary.

9# Setup to build custom kernel
10KERNEL_CFG_NAME ?= flounder
11KERNEL_SRC_DIR ?= kernel/htc/flounder
12TARGET_KERNEL_ARCH ?= arm64
13KERNEL_OUT_DIR ?= $(PRODUCT_OUT)/linux/kernel ----------------- $(PRODUCT_OUT)=out/target/product/flounder32
14
15# Check for availability of kernel source
16ifneq ($(wildcard $(KERNEL_SRC_DIR)/Makefile),)
17  # Give precedence to TARGET_PREBUILT_KERNEL
18  ifeq ($(TARGET_PREBUILT_KERNEL),)
19    TARGET_KERNEL_BUILT_FROM_SOURCE := true
20  endif
21endif
25
26PRODUCT_NAME := firetab_flounder
27PRODUCT_DEVICE := flounder32

23# fosmod_nexus_support begin
24ifneq ($(TARGET_KERNEL_BUILT_FROM_SOURCE), true)
25ifeq ($(TARGET_PREBUILT_KERNEL),)
26ifeq ($(USE_SVELTE_KERNEL), true)
27LOCAL_KERNEL := device/htc/flounder_svelte-kernel/Image.gz-dtb
28else
29LOCAL_KERNEL := device/htc/flounder-kernel/Image.gz-dtb
30endif # USE_SVELTE_KERNEL
31else
32LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL)
33endif
34endif # $(TARGET_KERNEL_BUILT_FROM_SOURCE), true)
35# fosmod_nexus_support end

In this file, there is another important definition PRODUCT_DEVICE. It determine where to find BoardConfig.mk and AndroidBoard.mk

4. BoardConfig.mk (device/htc/flounder/flounder32/BoardConfig.mk)  ----- use "printconfig" to check

3TARGET_CPU_ABI := armeabi-v7a
4TARGET_CPU_ABI2 := armeabi
5TARGET_ARCH := arm
6TARGET_ARCH_VARIANT := armv7-a-neon
7TARGET_CPU_VARIANT := cortex-a15
8
9TARGET_2ND_ARCH :=
10TARGET_2ND_ARCH_VARIANT :=
11TARGET_2ND_CPU_ABI :=
12TARGET_2ND_CPU_ABI2 :=
13TARGET_2ND_CPU_VARIANT :=

5. AndroidBoard.mk (device/htc/flounder/flounder32/AndroidBoard.mk)

28include $(LOCAL_PATH)/../AndroidKernel.mk

6. AndroidKernel.mk (device/htc/flounder/AndroidKernel.mk)  ----------  build from source code

10ifeq ($(TARGET_KERNEL_BUILT_FROM_SOURCE),true)
11
12# Force using bash as a shell, otherwise, on Ubuntu, dash will break some
13# dependency due to its bad handling of echo \1
14MAKE += SHELL=/bin/bash
15
16ifeq ($(KERNEL_CFG_NAME),)
17$(error cannot build kernel, config not specified)
18endif
19
20ifeq ($(KERNEL_OUT_DIR),)
21$(error cannot build kernel, no out dir specficied)
22endif
23
24KERNEL_TOOLCHAIN_ARCH := arm64
25
26KERNEL_EXTRA_FLAGS := ANDROID_TOOLCHAIN_FLAGS="-mno-android -Werror"
27KERNEL_CROSS_COMP := aarch64-linux-android-
28
29KERNEL_CCACHE :=$(firstword $(TARGET_CC))
30KERNEL_PATH := $(ANDROID_BUILD_TOP)/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
31ifeq ($(notdir $(KERNEL_CCACHE)),ccache)
32KERNEL_CROSS_COMP := "ccache $(KERNEL_CROSS_COMP)"
33KERNEL_PATH := $(KERNEL_PATH):$(ANDROID_BUILD_TOP)/$(dir $(KERNEL_CCACHE))
34endif
35
36#remove time_macros from ccache options, it breaks signing process
37KERNEL_CCSLOP := $(filter-out time_macros,$(subst $(comma), ,$(CCACHE_SLOPPINESS)))
38KERNEL_CCSLOP := $(subst $(space),$(comma),$(KERNEL_CCSLOP))
39
40KERNEL_CONFIG := $(KERNEL_OUT_DIR)/.config
41KERNEL_SAVE_DEFCONFIG := $(KERNEL_OUT_DIR)/defconfig
42KERNEL_BLD_FLAGS := \
43    ARCH=$(TARGET_KERNEL_ARCH) \
44    $(KERNEL_EXTRA_FLAGS)
45
46KERNEL_BLD_FLAGS :=$(KERNEL_BLD_FLAGS) \
47     O=../../../$(KERNEL_OUT_DIR) \
48
49KERNEL_BLD_ENV := CROSS_COMPILE=$(KERNEL_CROSS_COMP) \
50    PATH=$(KERNEL_PATH):$(PATH) \
51    CCACHE_SLOPPINESS=$(KERNEL_CCSLOP)
52
53KERNEL_DEFCONFIG ?= $(KERNEL_SRC_DIR)/arch/arm64/configs/$(KERNEL_CFG_NAME)_defconfig
54KERNEL_VERSION_FILE := $(KERNEL_OUT_DIR)/include/config/kernel.release
55KERNEL_BZIMAGE := $(PRODUCT_OUT)/kernel
56
57$(KERNEL_CONFIG): $(KERNEL_DEFCONFIG)
58	$(hide) echo Regenerating kernel config $(KERNEL_OUT_DIR)
59	$(hide) mkdir -p $(KERNEL_OUT_DIR)
60	$(hide) $(KERNEL_BLD_ENV) $(MAKE) -C $(KERNEL_SRC_DIR) $(KERNEL_BLD_FLAGS) $(notdir $(KERNEL_DEFCONFIG))
61
62ifeq (,$(filter build_kernel-nodeps,$(MAKECMDGOALS)))
63$(KERNEL_BZIMAGE): $(MINIGZIP)
64endif
65
66$(KERNEL_BZIMAGE): $(KERNEL_CONFIG)
67	$(hide) $(KERNEL_BLD_ENV) $(MAKE) -C $(KERNEL_SRC_DIR) $(KERNEL_BLD_FLAGS)
68	$(hide) cp -f $(KERNEL_OUT_DIR)/arch/arm64/boot/Image.gz-dtb $@
69
70clean_kernel:
71	$(hide) $(KERNEL_BLD_ENV) $(MAKE) -C $(KERNEL_SRC_DIR) $(KERNEL_BLD_FLAGS) clean
72
73menuconfig xconfig gconfig: $(KERNEL_CONFIG)
74	$(hide) $(KERNEL_BLD_ENV) $(MAKE) -C $(KERNEL_SRC_DIR) $(KERNEL_BLD_FLAGS) $@
75	$(hide) $(KERNEL_BLD_ENV) $(MAKE) -C $(KERNEL_SRC_DIR) $(KERNEL_BLD_FLAGS) savedefconfig
76	$(hide) cp -f $(KERNEL_SAVE_DEFCONFIG) $(KERNEL_DEFCONFIG)
77	$(hide) echo ===========
78	$(hide) echo $(KERNEL_DEFCONFIG) has been modified !
79	$(hide) echo ===========
80
81TAGS_files := TAGS
82tags_files := tags
83gtags_files := GTAGS GPATH GRTAGS GSYMS
84cscope_files := $(addprefix cscope.,files out out.in out.po)
85
86TAGS tags gtags cscope: $(KERNEL_CONFIG)
87	$(hide) $(KERNEL_BLD_ENV) $(MAKE) -C $(KERNEL_SRC_DIR) $(KERNEL_BLD_FLAGS) $@
88	$(hide) rm -f $(KERNEL_SRC_DIR)/$($@_files)
89	$(hide) cp -fs $(addprefix `pwd`/$(KERNEL_OUT_DIR)/,$($@_files)) $(KERNEL_SRC_DIR)/
90
91
92define build_kernel_module
93$(error Use of external Kernel modules is not allowed)
94endef
95
96.PHONY: menuconfig xconfig gconfig
97.PHONY: $(KERNEL_BZIMAGE)------------------ target passed from build/core/Makefile INSTALLED_KERNEL_TARGET
98.PHONY: build_kernel build_kernel-nodeps
99
100$(PRODUCT_OUT)/boot.img: build_kernel --------------------  pack KERNEL_BZIMAGE into boot.img in build/core/Makefile
102endif #TARGET_KERNEL_BUILT_FROM_SOURCE

7. build from prebuilt binary

58ifneq ($(LOCAL_KERNEL),)
59PRODUCT_COPY_FILES += $(LOCAL_KERNEL):kernel
60endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值