编译Android4.3内核源代码
------------------------------------------------------------------------------------------------------
转载或引用请务必注明原文地址:
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内核源代码的更多相关文章
- 如何下载和编译Android4.0内核源代码goldfish(图像)
如何下载Android4.0源代码.请参阅我的博客文章中有(同样是图文教程): http://blog.csdn.net/flydream0/article/details/7036156 怎样编译A ...
- 怎样下载并编译Android4.0内核源代码goldfish(图文)
关于怎样下载Android4.0源代码,请查看我的博客内还有一篇文章(相同是图文教程): http://blog.csdn.net/flydream0/article/details/7036156 ...
- 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
原文网址:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码 ...
- 编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上
编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上 作者:雨水 日期:2014-04-30 编译源码的目的还是为了自己改动源码,然后还可以执行在相应的手机 ...
- 基于Ubuntu 14.04 LTS编译Android4.4.2源代码
转载自:雨水:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码 ...
- 【转】如何下载并编译Android4.0内核源码goldfish(图文)
原文网址:http://blog.csdn.net/flydream0/article/details/7070392 关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程 ...
- Ubuntu:编译Linux内核源代码和内核模块
1. 目的 内核模块需要运行在Linux 3.8.13内核中,因此需要为此内核重新编译内核模块源代码. 2. 步骤 1.在Ubuntu 14.04 64位(内核3.13.0-24-generic)上, ...
- Ubuntu10.04下载并编译Android4.3源代码
注:转载或引用请标明出处 http://blog.csdn.net/luzhenrong45/article/details/9719433 去年用Ubuntu10.10成功下载并编译Andro ...
- 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6564592 在前一篇文章提到,从源代码树下载下 ...
随机推荐
- 为什么Nagios会那么吵?你又能做些什么呢?(1)
如果你受困于 Nagios 的告警洪潮中不能自拔,那么这两篇连载博客就是为你而生的.让我们来详细的阐述下这个问题! 运维人员都有着独立的监控工具,因此会经常受到 Nagios 告警吵闹的影响.很多运维 ...
- PHP file_get_contents() 函数
定义和用法 file_get_contents() 函数把整个文件读入一个字符串中. 和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串. file_get ...
- grab jpegs from v4l2 devices
某些平台下opencv不能直接直接支持摄像头获取图片或视频,这是需要使用v4l2(video for linux 2) 测试v4l2是否可以读到摄像头的内容,最简单的办法就是读取一张截图. v4l2g ...
- [转]C,C++开源项目中的100个Bugs
[转]C,C++开源项目中的100个Bugs http://tonybai.com/2013/04/10/100-bugs-in-c-cpp-opensource-projects/ 俄罗斯OOO P ...
- [Quick-x lua]CCLabel类数字变化动作
之前写了个C++版本的,现在改成lua的, 两者原理是一样,但是动作的执行方式有些微区别 (因为lua无法继承CCActionInterval类,单纯使用lua的话无法调用action的update方 ...
- Tolerance (定义发票允差)
(N) AP > Setup > Invoice > Tolerance (定义发票允差) 这里只对价格进行了设置,其他保持了默认.To set tolerance levels f ...
- Master Nginx(3) - Using the Mail Module
Basic proxy service Authentication service Combining with memcached Interpreting log files Operating ...
- (转载)一句简单命令重启nginx - [nginx]
(转载)http://iambin.blogbus.com/logs/62429223.html 经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单. ...
- FZU 2225 小茗的魔法阵 扫描线+树状数组
这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
- HDU5653 Bomber Man wants to bomb an Array 简单DP
题意:bc 77 div1 1003(中文题面) 分析:先不考虑将结果乘以 1e6. 设 dp[i] 为从前 i 个格子的状态可以获得的最大破坏指数. 那么我们可以枚举每个炸弹,该炸弹向左延伸的距离和 ...