Android移植主要就是Linux内核的移植,而Linux内核的移植主要是Linux驱动的移植。为了开发和测试Linux驱动,需在Ubuntu Linux下搭建两套开发环境:Android应用程序开发环境和Linux内核开发环境。需要对源代码进行下载和编译,由于Android源代码包含了很多东西,如内嵌在Android系统中的应用程序的源代码,Android SDK带的各种工具的源代码,Android NDK的源代码,以及HAL源代码,所以对Android源代码的下载、编译和测试过程比较复杂、繁琐,在这里就先介绍相对比较简单的下载和编译Linux内核源代码的方法和步骤。
下载的Android源代码并没有包含Linux内核源代码,要想使用Linux内核,必须要单独下载Linux内核源代码,必须从Google提供的网址下载Android中使用的Linux内核源代码。
1.下载Linux内核源代码:执行命令“# git clone https://android.googlesource.com/kernel/common,git”可以下载最新的Linux内核源代码,下载会花费较长的时间。下载完成后,在当前目录下会有一个common目录,进入该目录,执行命令“# git branch -a”查看当前有哪些远程版本库。根据版本情况从版本库导出最新的Linux内核,可以使用命令“# git checkout -b android-3.0 remotes/origin/android-3.0”导出Linux 3.0的内核。Google专门为Android模拟器提供了一个Linux内核goldfish,可以使用命令“# git clone http://android.googlesource.com/kernel/goldfish.git”下载该内核。下载完成后,进入goldfish目录,执行命令“# git checkout -b android-goldfish-2.6.29 remotes/origin/android-goldfish-2.6.29”导出goldfish。
2.Linux内核源代码的目录结构,有arch,block,Documentation,drivers,firmware,fs,include等多个目录。
3.安装Android内核的编译环境:在Ubuntu Linux下编译Linux内核需要安装交叉编译器。交叉编译器就是指在A架构的CPU上编译可在B架构CPU上运行的程序。主要是因为编译器无法在目标平台上安装或目标平台性能较低,不得已才在性能较高限制较少的平台上进行编译。在编译Linux内核之前,需配置Linux内核源代码根目录下的Makefile文件。打开Makefile,找到ARCH和CROSS_COMPILE,并将这两个变量设置成如下值“ARCH ?= arm
CROSS_COMPILE?= arm-none-linux-gnueabi-”,其中ARCH变量表示将Linux源代码编译成可在ARM架构上运行的Linux内核。CROSS_COMPILE变量表示交叉编译器的前缀。打开交叉编译者的bin目录,可以看到很多以arm-none-linux-gnueabi-开头的命令,如arm-none-linux-gnueabi-gcc、arm-none-linux-gnueabi-gdb等。由于编译Linux内核可能会使用很多这样的命令,为了方便,Linux内核允许值只设置这些命令的前缀,就可找到相应的编译命令。安装交叉编译器步骤如下:
①准备工作:将arm-linux-gcc-4.3.2.tgz文件和arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2文件复制到工作目录
②解压编译器:使用命令
“# tar zxvf arm-linux-gcc-4.3.2.tgz -C /
# tar jxvf arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2 -C /”
解压两个压缩文件
③验证交叉编译器是否安装成功,使用命令“# ls /usr/local/arm -l”④安装libncurses5,为了配置内核make menuconfig,libncurses5可以为字符界面的Linux终端提供一个美观的界面,使用命令“# apt-get install libncurses5-dev”
4.配置和编译Linux内核:如果内核源代码目录是“/root/linux_kernel”,使用命令
“# export PATH=/root/compilers/arm-none-linux-gnueabi/bin:$PATH
# cd ~/linux_kernel
# make clean
# make”
编译Linux内核,make clean命令用于清除大多读由编译生成的.o、.ko等文件,但保留配置文件。一般新下载的Linux源代码根目录都没有.config文件,而这个文件决定了编译生成的Linux内核由哪些功能和模块组成。第一次拿到Linux内核时应先使用4个命令中的一个配置Linux内核,在Linux内核源代码根目录产生一个.config文件。在配置Linux内核前一般需确定自己的需求,需要什么样的驱动模块、是否支持调试、支持的CPU类型等。4个配置命令必须在Linux源代码根目录执行。
①make config:该命令以文本形式配置Linux内核。配置项后面中括号中的值是该配置项当前的值,如果中括号中有多个值,第一个是默认值,如果不设置,直接按回车就会保留默认值。
②make menuconfig:以字符界面风格的菜单形式配置Linux内核。配置界面后面带“-->”的菜单项说明还有子菜单。按回车键就可进入子菜单。很多菜单项前面有中括号,里面可以是“M”或“*”,也可以为空。有的菜单项前的中括号里只能设置“*”或空。中括号里的值表明当前菜单项对应的Linux内核组件嵌入Linux内核的方式。[M]表示以模块形式.ko文件动态安装在Linux内核中。[Y]表示Linux内核组件会嵌入Linux内核。当Linux内核成功启动后,这些组件会自动装载。如果为空表明该Linux内核组件不会包含到当前的Linux内核中。通过按“M”键可以将中括号中的值设置成“M”,按“Y”可将中括号中的值设为“Y”。按空格键可以在[M]、[Y]和空格之间进行切换。最后通过Exit退出设置界面后,如果修改了设置项,会询问是否保持刚才的设置。如果选Yes,则会根据刚才的设置重新生成.config文件。
③make oldconfig:与make config类似,也是以字符界面逐项要求用户配置。但它显示的要求用户参与的配置项要比make config少。大多数配置项都会给出默认值,并不需要用户进行配置。只有后面带NEW的配置项才需要用户配置,这些配置项都是当前Linux内核版本新加入的功能。
④make xconfig:以图形界面形式配置Linux内核,使用了QT的共享库,要执行此命令,必须安装QT,可使用命令“# apt-get install libqt4-dev”。安装完QT后,执行make xconfig。在界面中可以通过上面的保存安装保存设置,也可以使用打开按钮打开其它配置文件。在配置中有一项很重要,就是交叉编译器的签名。使用make menuconfig命令。成功编译Linux内核后,会在<Linux内核源代码根目录>/arch/arm/boot目录生成一个zImage文件。该文件就是Linux内核的二进制版本。可以直接使用zImage安装到开发板上,也可以使用命令“# emulator -avd myavd -kernel /root/kernel/goldfish/arch/arm/boot/zImage”在Android模拟器中测试Linux内核,需要使用由goldfish编译而成的zImage文件,myavd是一个AVD名称。