Android系统源代码编译—[5]构建内核

来源:互联网 发布:linux镜像文件iso下载 编辑:程序博客网 时间:2024/05/03 08:46

本文描述了仅构建内核的细节。接下来的说明假设你已经下载了完整的AOSP,并分别以真机和模拟器为例描述构建过程。

如果你是按照前面的文章已经下载了完整的Android代码就说明你的AOSP是完整的。

选择一个内核

这个表列出来内核源代码和二进制文件的名称和位置:

Device Binary location Source location Build configuration 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

真机(Nexus 5)

可以通过使用/dev/block/platform目录下的条目,来确定目标设备使用的芯片,

root@hammerhead:/dev/block/platform # lsmsm_sdcc.1

我这里是Nexus 5 得到的芯片信息是msm。

模拟器

模拟器的内核固定是goldfish。

下载源代码

Nexus 5

选择好要构建的内核后,就可以通过git clone开始下载对应的内核源代码,

root@Tangxx:~/android_source/android_442# mkdir kernel && cd $_root@Tangxx:~/android_source/android_442/kernel# git clone \> https://android.googlesource.com/kernel/msm.git

Clone完成后,我们就得到了对应代码分支的仓库,然而你会发现当前目录下没有任何文件,

root@Tangxx:~/android_source/android_442/kernel# cd msmroot@Tangxx:~/android_source/android_442/kernel/msm# lsroot@Tangxx:~/android_source/android_442/kernel/msm#

要获得AOSP支持设备的内核源代码,最后一步是check out正确的commit,由于在git仓库中kernel文件的commit信息和文档,总是落后于新设备的发布,我们可以使用/proc/version下的版本字符串,或者解压后的内核镜像。这里使用/proc/version下的版本字符串:

root@hammerhead:/ # cat /proc/version                                          Linux version 3.4.0-gadb2201 (android-build@vpbs1.mtv.corp.google.com) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Wed Nov 20 14:42:53 PST 2013

在获得的版本信息中最重要的是内核版本号中3.4.0-g后面的7位十六进制数字—adb2201 。用这个字符串就能check out 出准确的commit,

root@Tangxx:~/android_source/android_442/kernel/msm# git checkout adb2201HEAD is now at adb2201… mm: Hold a file reference in madvise_remove

至此,已经获得了目标设备的内核源代码副本。

模拟器

模拟器git clone goldfish版本内核,

root@Tangxx:~/android_source/android_442/kernel# git clone \> http://android.googlesource.com/kernel/goldfish.git

git clone完成后,可以使用

git branch -a

来查看支持那些Linux内核版本的下载,这里直接选择3.4版本内核进行下载,

这里写图片描述

root@Tangxx:~/android_source/android_442/kernel/goldfish# git checkout -t \> remotes/origin/android-goldfish-3.4 -b goldfish3.4

搭建编译环境

编译内核需要正确的编译环境,包括ARM编译工具链以及各种编译工具(eg,make),本文主要使用AOSP中预编译好的工具链。

第一步,配置编译环境,
这里写图片描述

Nexus 5

这里写图片描述

这里写图片描述

模拟器

这里写图片描述

这样AOSP目录就有了编译工具链,可以通过查询编译版本确认,

这里写图片描述

一些额外的步骤,设定系统环境变量通知内核我们使用的编译工具链,

root@Tangxx:~/android_source/android_442# cd kernel/msm/root@Tangxx:~/android_source/android_442/kernel/msm# export CROSS_COMPILE=arm-eabi-root@Tangxx:~/android_source/android_442/kernel/msm# export SUBARCH=armroot@Tangxx:~/android_source/android_442/kernel/msm# export ARCH=armroot@Tangxx:~/android_source/android_442/kernel/msm#

至此,编译环境就搭建好了。

配置内核

Linux内核支持很多架构和硬件组合,为了能够给任意一种配置组合编译内核,可以指定一个defconfig的配置面板,这个模板位于/arch/arm/configs目录中,比如,Nexus 5 的hammerhead代码版本可以使用hammerhead_defconfig。

root@Tangxx:~/android_source/android_442/kernel1/msm# make hammerhead_defconfig

最终编译系统会读取该配置模板,并写入.config文件中。

.config文件隐藏在内核代码根目录/kernel/msm下,可以通过CTRL+H查看,除了使用模板,还可以直接编辑这个配置文件,但推荐使用模板。

这里直接使用默认的配置面板即可,如果需要对编译后的内核进行调试,就需要修改特定的配置了,后续文章会讲到。

编译内核

当完成编译环境配置和内核配置后,就可以执行编译了,

root@Tangxx:~/android_source/android_442/kernel/msm# make[…] Kernel:arch/arm/boot/zImage is readyroot@Tangxx:~/android_source/android_442/kernel/msm#

至此,内核就编译完成了。

0 0
原创粉丝点击