上篇我对ARM版linux进行了编译与裁剪,下面将编译、裁剪Android内核,并在模拟器上运行编译后的系统。
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