------------------------------------------------------------------------------------------------------

转载或引用请务必注明原文地址:

http://blog.csdn.net/luzhenrong45/article/details/9882189

或联系作者:luzhenrong45@gmail.com

谢谢!

 ------------------------------------------------------------------------------------------------------

在上一篇文章《 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-

第一步:根据CPU体系架构修改硬件配置文件

配置内核用到以下两条指令的其中一条

   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内核初步编译成功!!!


编译Android4.3内核源代码的更多相关文章

  1. 如何下载和编译Android4.0内核源代码goldfish(图像)

    如何下载Android4.0源代码.请参阅我的博客文章中有(同样是图文教程): http://blog.csdn.net/flydream0/article/details/7036156 怎样编译A ...

  2. 怎样下载并编译Android4.0内核源代码goldfish(图文)

    关于怎样下载Android4.0源代码,请查看我的博客内还有一篇文章(相同是图文教程): http://blog.csdn.net/flydream0/article/details/7036156 ...

  3. 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码

    原文网址:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码       ...

  4. 编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上

    编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上 作者:雨水  日期:2014-04-30 编译源码的目的还是为了自己改动源码,然后还可以执行在相应的手机 ...

  5. 基于Ubuntu 14.04 LTS编译Android4.4.2源代码

    转载自:雨水:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码     ...

  6. 【转】如何下载并编译Android4.0内核源码goldfish(图文)

    原文网址:http://blog.csdn.net/flydream0/article/details/7070392 关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程 ...

  7. Ubuntu:编译Linux内核源代码和内核模块

    1. 目的 内核模块需要运行在Linux 3.8.13内核中,因此需要为此内核重新编译内核模块源代码. 2. 步骤 1.在Ubuntu 14.04 64位(内核3.13.0-24-generic)上, ...

  8. Ubuntu10.04下载并编译Android4.3源代码

    注:转载或引用请标明出处    http://blog.csdn.net/luzhenrong45/article/details/9719433 去年用Ubuntu10.10成功下载并编译Andro ...

  9. 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6564592 在前一篇文章提到,从源代码树下载下 ...

随机推荐

  1. 创建型-生成器模式(Builder)

    1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储 ...

  2. POJ2222+暴力搜索

    一共2^15个状态 比较简单 /* 2^15 states */ #include<stdio.h> #include<string.h> #include<stdlib ...

  3. MongoDB实战指南(二):索引与查询优化

    数据库保存记录的机制是建立在文件系统上的,索引也是以文件的形式存储在磁盘上,在数据库中用到最多的索引结构就是B树.尽管索引在数据库领域是不可缺少的,但是对一个表建立过多的索引会带来一些问题,索引的建立 ...

  4. 【HDOJ】Power Stations

    DLX.针对每个城市,每个城市可充电的区间构成一个plan.每个决策由N*D个时间及N个精确覆盖构成. /* 3663 */ #include <iostream> #include &l ...

  5. Getting Started Tutorial

    Getting Started Tutorial The topics contained in this section are intended to give you quick exposur ...

  6. 开发完整的Web项目必备

    开发工具 数据库系统 DB2数据库 Oracle数据库 SQL Server数据库 MySQL数据库 Access数据库 Web服务器 IIS BEA WebLogic Server Apache T ...

  7. bzoj1056

    花了一上午大概复习了一下splay,treap 像这种裸的数据结构题在js应该会越来越少 不过练练手也好, 这就是平衡树+hash,如果这是单纯的BST应用,还是写treap吧,好调试 ;       ...

  8. 【转】IOS 怎么获取外设的广播数据AdvData

    原文网址:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/73443.aspx N ...

  9. win7无法识别U盘,驱动信息:该设备的驱动程序未被安装。 (代码 28)

    台式机的win7 64位系统可以识别u盘,但笔记本的win7 64位却识别不了,说明U盘是可以用的.查看笔记本的设备管理器,发现驱动安装失败,提示信息为“该设备的驱动程序未被安装. (代码 28) ” ...

  10. Oracle 新增表空间文件

    ALTER TABLESPACE users ADD DATAFILE 'D:/oracle/oradata/orcl/users.dbf' SIZE 500M AUTOEXTEND ON NEXT ...