转:http://blog.csdn.net/zouliping123/article/details/8647845,http://blog.csdn.net/bill_xiang/article/details/8644099
第一篇:
编译Android内核
可供选择的内核源码有很多版本:
- $ git clone https://android.googlesource.com/kernel/common.git
- $ git clone https://android.googlesource.com/kernel/exynos.git
- $ git clone https://android.googlesource.com/kernel/goldfish.git
- $ git clone https://android.googlesource.com/kernel/msm.git
- $ git clone https://android.googlesource.com/kernel/omap.git
- $ git clone https://android.googlesource.com/kernel/samsung.git
- $ git clone https://android.googlesource.com/kernel/tegra.git
goldfish这个project包含了适合于模拟器平台的源码;
msm这个project包含了适合于ADP1、ADP2、Nexus One、Nexus 4的源码,并且可以作为高通MSM芯片组开发定制内核工作的起始点;
omap这个project包含了适合于PandaBoard、Galaxy Nexus的源码,并且可以作为德州仪器OMAP芯片组内核开发定制工作的起始点;
samsung这个project包含了适合于Nexus S的源码,并且可以作为三星蜂鸟芯片组内核开发定制工作的起始点;
tegra这个project包含了适合于Xoom和Nexus 7的源码,并且可以作为英伟达图睿芯片组内核开发定制工作的起始点;
exynos这个project包含了适合与Nexus 10的源码,并且可以作为三星猎户座芯片组内核开发定制工作的起始点。
- 创建一个目录android,用来存放我们即将要下载的android源码。
命令:$ mkdir android
- 进入上一步中建立好的目录android。
命令:$ cd android
- 选择一个内核版本,使用git下载android的源码。我选择了goldfish版本,该版本是适用于模拟器平台的内核版本。
命令:
$ git clone https://android.googlesource.com/kernel/goldfish.git
查看goldfish内核在git中的所有分支信息。
命令:$ git branch -a
选择适合的分支,下载goldfish真正的代码。
命令:$ git branch android-goldfish-2.6.29
- 在编译android内核时,需要使用交叉编译器。选择工具链,使用git下载prebuilt工具链。
命令:
$ git clonehttps://android.googlesource.com/platform/prebuilt
- 将工具链的其bin路径添加到PATH中,确保工具链在环境变量中。
命令:
$ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
6. 设置其他环境变量。
命令:
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
- 进入内核的目录中。
命令:$ cd goldfish
- 编译内核源码。首先,设定编译时的默认配置文件,如果不这么做,可能会出现“找不到配置文件”错误。
命令:$ make goldfish_defconfig
图1.执行make goldfish_defconfig命令
执行完此条命令后,会在goldfish目录下生成一个.config文件。接着可直接编译。
图2.执行完上条命令,生成.config文件
命令:$ make
图3.执行make命令
执行完该命令后,会在“kernel/goldfish/arch/arm/boot/”目录下生成名为zImage的文件,大小为1.7M左右。
图4.执行完make命令,生成zImage文件
裁剪Android内核
1. 为了使用makemenuconfig,需要安装ncurses。
命令:$ sudo apt-get install ncurses-dev
2. 进行内核配置,执行相应命令。
命令:$ make menuconfig
3. 进行内核裁剪。通过界面操作更改配置,以进行某些模块的裁剪。
图5.通过界面操作配置进行裁剪
4. 编译裁剪之后的内核。生成新的zImage文件,大小约为995K。
命令:$ make
图6.编译裁剪过的内核生成的zImage文件属性
通过上述裁剪的过程,可以进行相关类似的操作,以裁剪不同的模块,满足不同的需要。编译裁剪之后的内核一般会发现其生成的zImage文件的大小会变小。
第二篇:
1、建立Android开发环境:
在Oracle官网下载jdk-7u15-linux-i586.tar.gz,复制到/usr文件夹下并解压:
cp./jdk-7u15-linux-i586.tar.gz /usr
tar zxvfjdk-7u15-linux-i586.tar.gz
这样便在/usr文件夹下生成一个jdk1.7.0_15文件夹
修改环境变量,在/etc/profile文件最后添加:
export JAVA_HOME=/usr/jdk1.7.0_15
export JRE_HOME=/usr/jdk1.7.0_15/jre
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin
保存退出后执行source /etc/profile 使对/etc/profile的修改立即生效,
执行java –version命令,出现java版本信息说明建立好了Java开发环境
接着下载Android SDK(code.google.com/android/download_list.html),SDK中带有Android Emulator仿真器等工具,本文用:android-sdk_r21.1-linux.tgz,将其复制到/usr目录下并解压:
cpandroid-sdk_r21.1-linux.tgz /usr
tarzxvf android-sdk_r21.1-linux.tgz
这样便会在/usr 目录下产生一个文件夹android-sdk-linux,再次修改/etc/profile文件,在环境变量PATH后面增加/usr/android-sdk-linux/tools,用‘:‘与原有值分割:
接着运行命令android(即/usr/android-sdk-linux/tools下的android可执行文件)
会弹出Android SDK Manager图形窗口,选择安装一个Android版本的SDK Platform,我安装的是Android2.1,再安装Android SDK Tools和Android SDKPlatform-tools:
下载过程视网速不同长短不一,然后再菜单Tools里选择Manager AVDs…
在弹出的Android Virtual Device Manager中新建一个虚拟机,我创建的叫android2.1
创建完成后我们就可以通过emulator –avdandroid2.1命令来启动这个虚拟机
至此,android开发环境就搭建好了。
2、建立交叉编译环境:
下载交叉编译器arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2(http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/)
选择ARM processors下的GUN/Linux Release
填写姓名、邮箱等信息后编译器会被发送到你的邮箱中(我使用qq邮箱没收到,使用gmail收到了)
复制arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2到/usr目录下并解压缩:
cparm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 /usr
tar jxvfarm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
这样会在/usr目录下生成一个arm-2012.09文件夹,然后再次修改/etc/profile文件,在PATH中添加/usr/arm-2012.09/bin/
3、下载内核源码
下载Android内核源码linux-2.6.25-android-1.0_r1.tar.gz(http://android.googlecode.com/files/linux-2.6.25-android-1.0_r1.tar.gz)
在用户目录下新建文件夹android,将linux-2.6.25-android-1.0_r1.tar.gz复制到android文件夹中并解压:
mkdirandroid
cplinux-2.6.25-android-1.0_r1.tar.gz ./android
cd./android
tar zxvflinux-2.6.25-android-1.0_r1.tar.gz
这样会在android文件夹中产生一个linux-2.6.25-android-1.0_r1文件夹,进入此文件夹,修改该文件夹中的Makefile,找到ARCH和CROSS_COMPILE的定义,改为:
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
4、编译内核源码
接下来就可以编译Android内核了,执行如下命令:
make goldfish_defconfig
make
其中make goldfish_defconfig指令的意思是将目录linux-2.6.25-android-1.0_r1/arch/arm/configs/下的goldfish_defconfig文件内的配置内容复制到linux-2.6.25-android-1.0_r1目录下的.config文件中,.config文件是一个隐藏文件。Goldfish是一种虚拟的ARM处理器,在Android的仿真环境中使用。Android模拟器通过运行它来运行arm926t指令集,由于我最后要使用模拟器运行编译好的内核,所以这里使用goldfish_defconfig配置文件
编译过程需要等待一段时间
编译好后会在linux-2.6.25-android-1.0_r1/arch/arm/boot文件夹下生成一个zImage文件,为1.3MB(1299168bytes):
5、运行
emulator–avd android2.1 –kernel ./arch/arm/boot/zImage
这里的–avdandroid2.1指定我们前面所创建的虚拟机名字,
–kernel./arch/arm/boot/zImage指定该虚拟机从我们所编译的内核启动,启动后在Setting的About Phone中可以看到内核版本Kernel version中billxiang@billxiang-VirtualBox即我在虚拟机中编译内核时的用户名
6、内核裁剪
接着对Android内核进行裁剪,裁剪比较麻烦,搞不好就启动不了了,这里我通过修改linux-2.6.25-android-1.0_r1/arch/arm/configs/下的goldfish_defconfig文件进行裁剪,打开goldfish_defconfig,找到CONFIG_GOLDFISH_TTY=y,将其注释掉:
这里的TTY是应该是指命令行终端,在Android中基本没有用处,所以我将其裁掉,
再次make goldfish_defconfig
make
这时新生成的zImage文件变成了1298216bytes,由于我裁剪的内容不多,所以编译后内核大小变化不大,但还是有所减小(如果将网络支持裁剪掉内核可以减小到几百K,但无法启动…)。
6、运行
emulator –avd android2.1 –kernel./arch/arm/boot/zImage