------------------------------------------------------------------------------------------------------
此文章仅作为学习交流所用
转载或引用请务必注明原文地址:
http://blog.csdn.net/luzhenrong45/article/details/9882189
或联系作者:[email protected]
谢谢!
------------------------------------------------------------------------------------------------------
在上一篇文章《 Ubuntu10.04下载并编译Android4.3源代码》记录了Android4.3源代码的下载,编译和运行模拟器的学习过程,从下载下来的源码目录中我们不难发现,Android源代码工程并没有包含Linux内核代码,也就是缺少Kernel代码。
那么,Android源码里面没有Kernel代码,我们之前又怎么可以通过编译源代码运行一个Android的模拟器呢?那是因为启动模拟器时,Linux Kernel镜像默认使用:prebuilt/qemu-kernel/arm/kernel目录下的kernel-qemu文件。因此,如果我们想要手机或者模拟器运行特定的Kernel内核,我们就需要另外下载编译和运行Kernel内核代码了。下面,让我们一起学习Linux Kernel下载,编译和模拟器运行指定内核的过程。
同样,这个过程,官网有有详细说明,同样,官网地址:http://source.android.com/source/building-kernels.html
一. 下载Android Kernel内核源代码
很明显,我们需要先把Android源代码目录中没有的kernel下载下来。首先,进入Android源码目录,新建 一个目录,命名为kernel
cd ~/Android4.3 mkdir kernel选择下载我们想要的内核代码,至于运行模拟器需要下载哪个kernel,可参考如下官网的说明
因为我们现在做的是为之前的模拟器指定特定的内核,所以按照官网的说明,应该选择goldfish作为我们的内核代码
Goldfish是一种虚拟的ARM处理器,在Android的仿真环境中使用。在Android的发展过程中,Goldfish内核的版本也从开始的linux2.6.25升级到了linux2.6.29,现在又升级到全新的linux-3.4.它的核心内容存放在:arch/arm/mach-goldfish
因此,进入kernel,使用git clone命令将内核代码下来,这个需要一点时间
$ cd kernel $ git clone https://android.googlesource.com/kernel/goldfish.git
当我们下载完成之后,kernel目录中会多出来一个goldfish目录(下载不同的内核代码,其生成的目录相应改变),进入goldfish目录
cd goldfish选择一条支线代码作为我们的内核代码,可使用如下命令进行支线代码的查看
$ git branch -a
虽说Android是基于Linux开发出来的手机系统,但是,Android Kernel相比于标准的Linux Kernel,还是有一些稍微的不同的
因为我们这里是使用Android模拟器来运行Android系统的,所以,应该选择android-goldfish-xxx的,这里我尝试使用最新的Android kernel来作为模拟器的内核。因此,在goldfish目录下执行下面语句开始指定最新的支线代码:
$ git checkout remotes/origin/archive/android-gldfish-3.4执行完毕之后,原来是空文件夹的goldfish,现在就出现了Linux的内核源代码了。
二. 编译Android Kernel内核源代码
第一步:配置交叉编译工具路径到环境变量并修改MK文件
编译Android内核源代码需要用到交叉编译工具,它位于Android源码工程的prebuilds的子目录中,在以前的Android源码中,它具体的位置是prebuilds/linux-x86/toolchain的子目录中,但是,不知从什么时候起,它现在(Android4.3)放在prebuilts/gcc/linux-x86/arm/的子目录中。
因此,进入goldfish目录,将交叉编译工具的路径配置进来 :
$ export PATH=$(pwd)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH
另外,在编译内核之前,需要先修改一下goldfish目录下的makefile文件,首先打开该文件,找到如下地方:
在该Makefile文件中,我们将ARCH的值设置为arm,CROSS——COMPILE的值设置成arm-eabi-,如下图所示:
arm设置Android模拟器所使用的CPU是ARM体系结构的,而arm-eabi-,表示所使用的交叉编译工具名称是以“arm-eabi-”作为前缀的。以上这个步骤,也可以用以下指令来来完成:
$ export ARCH=arm $ export SUBARCH=arm $ export CROSS_COMPILE=arm-eabi-
配置内核用到以下两条指令的其中一条
make goldfish_defconfig 或 make goldfish_armv7_defconfig
至于具体取用哪条配置指令,视你的Android模拟器CPU体系构架而定。如果是arm v5版本的,则使用make goldfish_defconfig,而如果是arm v7版本的,则使用make goldfish_armv7_defconfig。那么,怎么知道你的模拟器CPU体系构架的版本呢?首先,和以前一样,进入源码目录,启动一个默认的模拟器。但是,注意这一次在emulator命令后加一个参数 &,表明以后台方式运行模拟器,以便于我们可以继续在终端输入命令查看CPU配置。如果没有加&,那么,没有关掉模拟器,是无法继续输入命令的。
guoke5@guoke5-pc:~$ cd /home/guoke5/Android4.3/ guoke5@guoke5-pc:~/Android4.3$ . build/envsetup.sh guoke5@guoke5-pc:~/Android4.3$ lunch full-eng guoke5@guoke5-pc:~/Android4.3$ emulator & (注意加&)此时,以后台形式开始运行默认模拟器,在终端中搞一下回车,可以继续操作终端,输入以下指令,查看CPU配置。
guoke5@guoke5-pc:~/Android4.3$ adb shell root@generic:/ # cat /proc/cpuinfo
很清楚可以知道,该模拟器CPU是arm v7版本的,因此,这里我们使用make goldfish_armv7_defconfig指令,其实这条指令的实质是将arch/arm/configs/目录下的goldfish_armv7_defconfig文件复制给 .config文件,如下图所示:
第三步:执行make命令开始真正编译内核
make
编译结束之后,会提示 Kernel: arch/arm/boot/zImage is ready,表示编译成功,而且会在“kernel/goldfish/arch/arm/boot/”目录下生成名为zImage的文件,这个就是我们自己编译好的Android内核镜像文件。
三. 指定内核运行Android模拟器
在上一篇文章《 Ubuntu10.04下载并编译Android4.3源代码》, 我们用emulator命令运行了一个Android4.3的模拟器,但是这个命令并没有带参数,所以,它会使用一个默认的模拟器,运行默认的内核镜像,这个默认的内核镜像zImage是位于Android源码目录下的prebuilds/qemu-kernel/arm子目录中的kernel-qemu文件
(老版本的是在out/host/linux-x86/bin子目录中kernel-qemu)。我们,我们用 -kernel选项来让模拟器运行我们刚刚编译好的内核,在源码目录中,执行
emulator -kernel ./kernel/goldfish/arch/arm/boot/zImage &指令后面带了参数 &,表示在后台运行Android模拟器,便于我们可以在终端中继续输入命令查看是不是已经运行了我们自己编译的内核版本。模拟器正常运行:
接着继续在终端中输入命令查看内核镜像信息:
guoke5@guoke5-pc:~/Android4.3$ adb shell root@generic:/ # cd proc提示如下信息:
说明此时模拟器运行的内核镜像的版本是Linux Version 3.4.0,编译的主机名是guoke5@guoke5-pc,编译时间是Mon Aug 12 16:59:45 CST 2013,也就是刚刚,通过这些信息,可以肯定,此时模拟器运行的内核镜像,就是我们刚编译完的zImage镜像文件。可以通过下面两张图片比较两者的不同
第一张图片是默认启动的模拟器,而第二张图片则是我们刚刚编译运行的模拟器,通过查看两者的内核版本信息,也可以发现两者的不同
到此,Android内核初步编译成功!!!