本页详细介绍了如何仅编译内核。以下说明假设您尚未下载整个 AOSP;如果您已完成下载,则可以跳过 git clone
对应的步骤,但下载内核源代码的步骤除外。
本部分中的所有示例均使用 hikey 内核。
此表列出了内核源代码和二进制文件的名称及所在位置:
设备 | 二进制文件所在的位置 | 源代码所在的位置 | 编译配置 |
---|---|---|---|
marlin | device/google/marlin-kernel | kernel/msm | marlin_defconfig |
sailfish | device/google/marlin-kernel | kernel/msm | marlin_defconfig |
hikey | device/linaro/hikey-kernel | kernel/hikey-linaro | hikey_defconfig |
angler | device/huawei/angler-kernel | kernel/msm | angler_defconfig |
bullhead | device/lge/bullhead-kernel | kernel/msm | bullhead_defconfig |
shamu | device/moto/shamu-kernel | kernel/msm | shamu_defconfig |
fugu | device/asus/fugu-kernel | kernel/x86_64 | fugu_defconfig |
volantis | device/htc/flounder-kernel | kernel/tegra | flounder_defconfig |
hammerhead | device/lge/hammerhead-kernel | kernel/msm | hammerhead_defconfig |
flo | device/asus/flo-kernel/kernel | kernel/msm | flo_defconfig |
deb | device/asus/flo-kernel/kernel | kernel/msm | flo_defconfig |
manta | device/samsung/manta/kernel | kernel/exynos | manta_defconfig |
mako | device/lge/mako-kernel/kernel | kernel/msm | mako_defconfig |
grouper | device/asus/grouper/kernel | kernel/tegra | tegra3_android_defconfig |
tilapia | device/asus/grouper/kernel | kernel/tegra | tegra3_android_defconfig |
maguro | device/samsung/tuna/kernel | kernel/omap | tuna_defconfig |
toro | device/samsung/tuna/kernel | kernel/omap | tuna_defconfig |
panda | device/ti/panda/kernel | kernel/omap | panda_defconfig |
stingray | device/moto/wingray/kernel | kernel/tegra | stingray_defconfig |
wingray | device/moto/wingray/kernel | kernel/tegra | stingray_defconfig |
crespo | device/samsung/crespo/kernel | kernel/samsung | herring_defconfig |
crespo4g | device/samsung/crespo/kernel | kernel/samsung | herring_defconfig |
确定要使用的设备项目之后,请查看内核二进制文件的 Git 日志。设备项目采用 device/<vendor>/<name>
形式。
$ git clone https://android.googlesource.com/kernel/hikey-linaro
$ cd hikey-linaro
$ git log --max-count=1 kernel
内核二进制文件的提交消息中包含用于编译二进制文件的内核源代码的部分 Git 日志。该日志中的第一个条目是最新内容(也即用于编译内核的条目)。请记下提交消息,因为您在后续步骤中会用得到该消息。
要确定系统映像中使用的内核版本,请对内核文件运行以下命令:
$ dd if=kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
对于 Nexus 5 (hammerhead),请运行以下命令:
$ dd if=zImage-dtb bs=1 skip=$(LC_ALL=C od -Ad -x -w2 zImage-dtb | grep 8b1f | cut -d ' ' -f1 | head -1) | zgrep -a 'Linux version'
使用适当的 git clone
命令为您要编译的内核下载源代码:
$ git clone https://android.googlesource.com/kernel/common.git
$ git clone https://android.googlesource.com/kernel/hikey-linaro
$ git clone https://android.googlesource.com/kernel/x86_64.git
$ git clone https://android.googlesource.com/kernel/exynos.git
$ git clone https://android.googlesource.com/kernel/goldfish.git
$ git clone https://android.googlesource.com/kernel/msm.git
$ git clone https://android.googlesource.com/kernel/omap.git
$ git clone https://android.googlesource.com/kernel/samsung.git
$ git clone https://android.googlesource.com/kernel/tegra.git
goldfish
项目包含适用于所模拟的平台的内核源代码。msm
项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作使用 Qualcomm MSM 芯片组的起点。omap
项目用于 PandaBoard 和 Galaxy Nexus,可用作使用 TI OMAP 芯片组的起点。samsung
项目用于 Nexus S,可用作使用 Samsung Hummingbird 芯片组的起点。tegra
项目用于 Xoom、Nexus 7 (2012)、Nexus 9,可用作使用 NVIDIA Tegra 芯片组的起点。exynos
项目包含适用于 Nexus 10 的内核源代码,可用作使用 Samsung Exynos 芯片组的起点。x86_64
项目包含适用于 Nexus Player 的内核源代码,可用作使用 Intel x86_64 芯片组的起点。hikey-linaro
项目用于 HiKey 参考板,可用作使用 HiSilicon 620 芯片组的起点。确保预编译工具链位于您的以下路径中:
$ export PATH=$(pwd)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH
或
$ export PATH=$(pwd)/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6/bin:$PATH
在 Linux 主机上,如果您没有 Android 源代码树,则可以从以下路径下载预编译工具链:
$ git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6
当您了解了内核的最后一条提交消息并已成功下载内核源代码和预编译的 gcc 后,就可以编译内核了。以下编译命令使用了 hikey 内核:
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-android-
$ cd hikey-linaro
$ git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
$ make hikey_defconfig
$ make
要编译不同的内核,只需将 hikey-linaro
替换为您要编译的内核的名称即可。
映像会输出到 arch/arm64/boot/Image
目录;内核二进制文件会输出到 arch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb
文件。请将 Image
目录和 hi6220-hikey.dtb
文件复制到 hikey-kernel
目录。
或者,您可以在使用 make bootimage
(或编译启动映像的任何其他 make
命令行)时添加 TARGET_PREBUILT_KERNEL
变量。所有设备均支持该变量,因为它是通过 device/common/populate-new-device.sh
进行设置的。例如:
$ export TARGET_PREBUILT_KERNEL=$your_kernel_path/arch/arm/boot/zImage-dtb
注意:内核名称因设备而异。要找到内核的正确文件名,请参阅内核源代码中的 device/<vendor>/<name>
。