上一篇讲述了怎么下载android内核,这篇以编译google为android模拟器提供的内核goldfish为例,记录下我的编译过程。
一、下载交叉编译器
新建一个目录android_tools用于存放交叉编译器,然后cd到该目录下,执行如下指令:
git clone https://android.googlesource.com/platform/prebuilt
下载完成后在android_tools目录下会有一个prebuilt目录,该目录下内容如下:
然后为该交叉编译器设置环境变量:
export PATH=/home/jession/android_tools/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
二、编译前的配置
首先打开内核源码主目录下的Makefile文件,找到如下两句:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改如下:
ARCH ?= arm
CROSS_COMPILE ?= arm-eabi-
其中ARCH变量表示将Linux源代码编译成可在ARM架构上运行的Linux内核,CROSS_COMPILE变量表示交叉编译器的前缀。读者可打开交叉编译器下的linux-x86/toolchain/arm-eabi-4.4.3/bin目录,会发现其中的命令基本上都是以arm-eabi-开头的,如图:
配置好Makefile脚本后开始配置内核主目录下的.config文件(隐藏文件),一般新下载的Linux内核源码根目录下都没有.config文件,该文件决定了编译生成的Linux内核由哪些功能模块组成。可在内核根目录下面使用如下四个指令生成.config文件(这里没使用,所以具体情况也不清楚,用时自查):
make config :以文本形式配置Linux内核。
make menuconfig :以字符界面风格的菜单形式配置Linux内核(使用该命令须先按照libncurses5,为字符界面的Linux终端提供界面,安装方式:apt-get install libncurses5-dev)。
make oldconfig :类似于make config,只是要求用户参与的配置项更少,大多配置会给出默认值。
make xconfig :以图形界面形式配置Linux内核,须安装QT(apt-get install libqt4-dev)。
我们因为是编译android模拟器内核,有一种方式可以是我们无须配置就能得到.config文件,而且更符合android模拟器配置。方法如下,新建一个模拟器(因为这里我们编译android模拟器内核,需要测试结果,所以android-sdk必须下载。如果已创建模拟器,这步就不必了):
android create avd -n test -t 1 #在sdk的tools目录下进行
打开该模拟器:
emulator -avd test
模拟器开启后,使用如下命令导出模拟器文件系统下的/proc/config.gz文件,这里假设adb命令已添加进环境变量。
adb pull /proc/config.gz
执行上述命令后,config.gz文件会被pull到当前目录下,将其拷贝进内核源码主目录下,解压:
gunzip config.gz
得到config文件,然后将其改名为.config文件即可:
mv config .config
我在网上看到有人编译goldfish时使用如下指令得到了.config文件:
make goldfish_defconfig
我也试了一下,确实生成的.config文件,使用该.config配置文件编译内核后也成功生成了zImage二进制文件,但是使用该内核开启模拟器时却始终无法进入系统。
三、编译
如果以前编译过,可先使用make clean命令清除一些由编译生成的文件(.o、.ko等文件)。然后键入如下指令编译:
make
编译完成后会在内核源码目录的arch/arm/boot/下生成一个zImage文件,即为最终的内核二进制文件,使用上一步新建的模拟器进行测试:
emulator -avd test -kernel /home/jession/android_kernel/goldfish/arch/arm/boot/zImage
如果成功打开模拟器,表示编译成功,可使用adb shell进入模拟器文件系统查看当前内核版本:
cat /proc/version
得到结果如下图:
时间显示该内核为刚刚生成的。