请先参考 如何取得Android源代码 一文,通过repo来取得当前最新的android主线代码(或者拿名为android-SDK-1.5_r1的tag也无妨)。
1、Host OS编译环境准备
在取得android源代码和编译内核的过程中,我们已经至少安装了 cURL、 git-core、ncurses-dev、 build-essential等软件包(Python2.5已经捆绑在Ubuntu8.04中),不过这还不够,要完成Android代码树的编译,我 们还需要flex、bison、gperf、valgrind(可选)、libsdl-dev、libesd0-dev、libwxgtk2.6- dev、zlib1g-dev等软件包,好在apt-get可以帮我们一次搞定。
sudo apt-get install flex bison gperf valgrind libsdl-dev libesd0-dev libwxgtk2.6-dev zlib1g-dev
另外,编译过程中还需要用到JDK 5.0(注意JDK6.0不被支持),请到 Sun的官方网站 下载后安装。
2、工具链和环境变量
把JDK5.0加进$PATH,如:
$export PATH=$PATH:/home/william/jdk5.0/bin
然后可以用java -version来确认java的版本
除此之外,编译内核所作的环境变量和工具链的设置在编译系统映像时并不需要,这都由android的编译脚本搞定了。
3、关于编译选项
在build/core目录下的envsetup.mk定义了target的体系结构和OS,默认为arm和linux,我们暂时不涉及移植,所以不需要修改。
4、开始编译
做完上面的准备,在代码树的根目录下敲make就可以了,编译的过程大约需要持续1~2个小时,总计需要大约3.5G的可用空间。
5、测试生成的image
编译完成以后如果想在模拟器中运行,除了kernel的映像文件以外,所需的其他3个映像文件分别是:(位于out/target/product/generic/目录)
ramdisk.img
: 包含了在模拟器中启动Android所需的文件系统
system.img
: 初始的Android系统映像,包含了程序和库文件
userdata.img
: 初始的用户数据映像文件
模 拟器会首先到指定的AVD所在的目录查找是否有userdata映像存在,如果没有的话就会基于初始的userdata.img来创建一个,加载这3个映 像文件后,它会把system.img和userdata.img分别挂载载到ramdisk文件系统中的system和userdata目录下。所有的 用户数据都会被保存在AVD目录下的userdata-qemu.img中,初始的用户数据映像文件并不会被修改。
通过命令行参数启动模拟器,加载我们编译的系统映像的方法:
首先设定ANDROID_PRODUCT_OUT环境变量,指向out/target/product/generic/目录
(Update:实验证明这一步是没有必要的),然后运行
emulator @1.5_L2 -system system.img -ramdisk ramdisk.img
或者我们加上-kernel参数,用自己编出来的kernel来启动
系统成功启动的截图:
编译Android系统映像虽然花费了不少的时间,不过总体来说还是比较简单的,Android的build system帮助我们搞定了大部分的设置。