Ubuntu10.04下编译Android及内核源代码

来源:互联网 发布:域名绑定多个ip 编辑:程序博客网 时间:2024/06/02 09:49

最近想要编译Android的源代码,实际操作了一遍,发现没有想象的容易(当然我本人对Ubuntu及Linux开发并不熟悉),所以记录下来以备后忘,兼与君分享。

(可以同步参考官网教程:http://source.android.com/source/initializing.html,但官网教程没有我的文章详细)


【第一步:操作系统的选择】

首先,搭建任何一个编译开发环境,都会涉及到操作系统的选择。Google的官方说明中,明确指出目前只能在Ubuntu和Mac系统上搭建Android源代码的开发环境,并且,推荐使用Ubuntu10.04LTS版。

网上的相关帖子表明,在Mac上搭建环境要比在Ubuntu上复杂很多,而且更容易遇到错误。网上也有很多人尝试用Ubuntu的其他版本(比如12.04版)来搭建环境并获得了成功。但我的观点是:除非有及强烈的其他原因或自己故意找虐,否则最好按部就班地按照编译说明来搭建编译环境,这样获得成功的概率最高,而且出了问题能获得的帮助也比较多。

这里我使用虚拟机来搭建Android及内核源码的编译环境。原因很简单:越纯粹的环境越不容易出现冲突。现在的平台越来越多样化,工程依赖也越来越复杂,想在同一个平台上搞定所有项目的编译已经越来越不可能了,干脆搞简单一些。对开发人员来说,虚拟机不就是干这个用的嘛。

首先新建虚拟机(我用的是VMWare),安装Ubuntu10.04.4(LTS)版本,可以到这里下载:http://releases.ubuntu.com/10.04.4/。注意要选择64位版本(官方说明中提到:Gingerbread (2.3.x)及以上版本都需要64位环境)。我下载的是ubuntu-10.04.4-desktop-amd64.iso这个文件。

安装过程略去不说,只提一点:硬盘最好分配20G以上,有条件的话,内存可以分配2G,如果1G也可以,后面可以用交换分区来弥补(建议分配4G虚拟内存)。

------------------------------本段内容可以选读------------------------------------

关于交换分区,多说一点:

编译Android代码确实比较消耗内存,根据我的实测,起码4G以上。如果机器的条件有限,只能分配1~2G的虚拟机内存,那么其他的就要用Swap虚拟内存来凑了。所以,不管你用交换分区还是交换文件,建议设得大一点。我自己采用的是交换文件的方式,这样更灵活一些,如果一开始没有分配够,很容易可以追加。关于如何创建交换文件,在网上可以找到很多,我参考的是这篇:http://hi.baidu.com/praic/item/ab23b283ae7479c9ee083d62

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


【第二步:安装各种工具包】

要编译Android的代码,需要安装的工具很多,别着急,一个一个来吧。先说明一下,对不同的操作系统及不同的源代码版本来说,需要安装的工具是不完全相同的。这里,我们只针对Ubuntu10.04.4及Gingerbread以上的代码版本,来搭建环境。

安装工具包,将主要用到Linux下的apt-get工具,有兴趣的话可以了解下这个工具的使用方法:http://baike.baidu.com/view/1580236.htm

这里面,我们主要用到这样几个命令:

add-apt-repository "某个软件源的地址"//这个命令用来把包含相关工具包的地址更新给apt-get工具

apt-get update //用更新后的源地址列表,更新相关信息

apt-get install 工具包名字//安装相关工具

准备知识完毕,下面开始:


1、安装JDK6(按官网说法,编译Gingerbread之前版本的代码的话,需要安装jdk5

官网上的安装方法是行不通的,因为给出的那个源已经失效了,我也不能保证我给出的源在你按照这篇文章来搭建环境的时候仍然有效,所以,最保险的办法是在你安装的时候,百度一下“sun-java6-jdk ppa deb”来找到及时有效的源。这里我找到的地址是:deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse(!注意最后两个单词前面是有空格的!)

所以,打开终端窗口,依次输入(每输入一行,按一下回车,有些命令是要输入用户密码的):

sudo add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse"

sudo apt-get update

sudo apt-get insatall sun-java6-jdk

最后一行命令后,如果apt-get在源里找到了相关工具包,则会提示你是否继续安装Y/N,按y继续就可以了。下载速度视网络环境而定,下载完后还会有一个安装界面,包括你是否同意相关协议等,当然,怎么选你懂的。

2、安装git (版本控制工具,也是下载源代码的工具)

这里按官网的说明也会有问题,下载的git不是最新版本,和repo配合不好。所以,使用我使用了新的源并且安装新版git

sudo apt-add-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

3、安装其他工具,包括:

sudo apt-get install gnupg// 签名工具

sudo apt-get install flex// 词法分析工具

sudo apt-get install bison// 语法分析工具

sudo apt-get install gperf// Hash 工具

sudo apt-get install build-essential // 包含gcc在内的一整套编译工具

sudo apt-get install zip// zip压缩工具

sudo apt-get install curl// 下载工具

sudo apt-get install zlib1g-dev// zlib库

sudo apt-get install libc6-dev// 标准C库

sudo apt-get installlib32ncurses5-dev// ncurses的开发库

sudo apt-get install ia32-libs// 64位系统上的32位运行库

sudo apt-get install x11proto-core-dev// X11下的网络协议库

sudo apt-get install libx11-dev// X-Window开发库

sudo apt-get install lib32readline5-dev // 命令行开发库

sudo apt-get install lib32z-dev// zlib的32位编译工具

sudo apt-get install libgl1-mesa-dev// 符合Open-GL接口的实现库

sudo apt-get install g++-multilib// C++编译工具

sudo apt-get install mingw32// Win32的编译工具

sudo apt-get install tofrodos// DOS和Unix文本转换工具

sudo apt-get install python-markdown// 将txt转化成HTML的工具

sudo apt-get install libxml2-utils// XML工具

sudo apt-get install xsltproc// 将XML转化为HTML的工具

很多,是吧,要老老实实地一个一个地安装,缺一个也不行。

【第三步:下载源代码】

终于到了要下载代码的一步了。下载代码,要用到Google开发的Repo工具,它可以被看成是一个对git的封装,使得用起来方便一些。

1、下载repo

cd ~/// 进入用户文件夹

mkdir bin// 建立一个bin文件夹(当然,想用别的名字也可以),用来下载repo

PATH=$PATH:~/bin// 将文件夹加入PATH路径,这样后面运行repo命令的时候,系统能找到它在哪儿

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo//下载repo工具

chmod a+x ~/bin/repo// 开放repo的可执行权限

------------------------------本段内容可以选读------------------------------------

PATH=$PATH:~/bin用这种方式添加路径,只在当前任务有效,当你重新登陆以后就不管用了。

如果想永久生效,可以编辑~/.bashrc文件,在最后一行加入:

export PATH=“$PATH:~/bin”

重新登陆就可以了。

注:为了修改~/.bashrc文件,需要添加写权限,可以在~/目录下用chmod go+w .bashrc命令来搞定。命令行编辑工具vi我不会用,我就是在XWindow环境下编辑的,但因为.bashrc属于隐藏文件(.开头的文件都是隐藏的),需要在图形文件浏览器下按“ctrl+h”来显示所有文件,这样才能找到它。

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

2、初始化repo

首先,选择一个你要下载源代码的文件夹,这里我建立的是 ~/src/android/ 文件夹(建立文件夹的方法,不再赘述了)

cd ~/src/android/ // 进入建立的源代码文件夹

确定你要下载的源代码分支版本,可以查看这里:http://source.android.com/source/build-numbers.html

这里我选择的是Gingerbread的最后一个版本android-2.3.7_r1,所以我在~/src/android/文件夹下再建一个android-2.3.7_r1目录。(这样的好处是,以后我想下载其他版本的时候,就可以建立不同的路径把它们分开)

下面初始化Repo:

repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.7_r1// 注意 -b 参数用来指定你要下载的版本,如果不指定,默认是主版本

初始化过程中,会提示你输入用户名和邮箱,我输入的是我的Google邮箱账号。

3、下载代码

repo sync// 同步代码到本地

然后,等着吧。下载速度视网络环境而定,我在公司网络下花了2个小时,中间卡断了几次。不过,即使中间断网了也没关系,repo具备断点续传功能,只要再执行一遍repo sync就可以了。

【第四步:编译源代码】

source build/envsetup.sh// 执行 build/envsetup.sh 初始化编译环境, source是Linux命令,具体功能可以去网上查

lunch full-eng  // 定制想要编译的目标平台和类型,lunch是envsetup.sh里面设置到环境变量中的函数,full-eng参数的含义详见这里:http://source.android.com/source/building.html

make -j4// 正式启动编译,-j4用来指定编译线程的数量,视你的CPU状况而定,不是越大越好。具体说明,也可以参见上述文档。

编译速度跟机器配置,尤其是物理内存有很大关系,我给虚拟机分配1G和2G物理内存的时候,速度差别很大。在分配2G物理内存的情况下,编译差不多用了一个小时左右。

编译过程中,可能出现一些错误,命令行模式下保存的文本有限,有时候错误信息就滚出屏幕看不到了,可以在make的时候用额外的参数把编译信息重定位到文件中保存起来,这样出错的时候就有Log可查看了。

make -j4 2>&1|tee make_log// make_log是我起的Log文件名,你可以随意更换。2>&1|tee 这个参数使得编译过程中的信息得以保存,这是Linux的强大之处。

如果出错,可以把错误信息贴到网上去查,一般都能找到解决办法。我出过几次错误,都是内存不足引起的,后来我设置了4G虚拟内存,才编译通过。如果编译中间失败,重新编译之前,请运行:make clean,以清空之前的编译信息,然后在make -j4 (或者 make -j4 2>&1|tee make_log 带Log信息)重新启动编译。

【第五步:运行模拟器】

编译完成后,在源代码路径下会出现一个out文件夹,在 out/host/linux-x86/bin路径下有一个emulator文件,这个就是Android模拟器的执行文件。但如果你在命令行下输入:./emulator 并回车,会得到一个错误的结果,原因是emulator的运行还需要一些参数环境的设置。

编辑~/.bashrc文件(方法前面讲过),在最后加入下面两行。

export PATH="$PATH:~/src/android/android-2.3.7_r1/out/host/linux-x86/bin"
export ANDROID_PRODUCT_OUT="~/src/android/android-2.3.7_r1/out/target/product/generic"

重新登陆,在命令行模式下输入emulator运行(注意,要在XWindows环境下的命令行窗口里输入,因为emulator运行依赖图形环境),是不是OK啦!

其实,这只是emulator按默认参数的运行。网上有人会遇到这一步还是无法运行的情况,需要自己创建模拟器,不过我还算幸运,到这里就看到一个手机窗口了,呵呵。

【第六步:下载Kernel源代码】

Android是基于Linux内核的操作系统,跟其他Linux操作系统一样,它可以搭配不同版本的内核运行。从源代码结构上,也是分为Android源码和Kernel源码两部分。接下来,我们开始下载并编译Android的内核源码。

1、下载代码

在下载Android代码的时候,我们使用的是Repo工具,它可以被视为是git的一个封装。但下载内核,没有repo可以用,我们需要使用原始的git命令。

首先,建立kenel代码路径,我是在~/src/android下面,跟android-2.3.7_r1并列,建立了一个kernel文件夹。

cd ~/src/android/kernel

git clone https://android.googlesource.com/kernel/goldfish.git// 地址跟你选择的内核版本有关系,goldfish是emulator可用的内核版本

这个过程稍微慢一点,因为要在本地构建整个仓库树。完成后,kernel路径下会多一个goldfish文件夹,但里面是空的。

cd goldfish

git branch -a // 查看当前分支,并选择一个进行下载,这里面我选择的是android-goldfish-2.6.29,下面以此为例:

git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29// checkout 选定的分支,这里你可以选择下载不同的分支


2、设置环境变量

编译内核需要交叉编译工具,这个工具在Android源代码包中有,这里需要把它添加到环境变量中。

在用户目录下的.bashrc文件中添加下列内容:

export PATH=$PATH:~/src/android/android-2.3.7_r1/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-

3、编译内核

在内核代码路径下(我的路径是 ~/src/android/kernel/goldfish/ )

make goldfish_defconfig

make

编译内核的速度可比编译Android的要快多了。在我的虚拟机上,用了不到十分钟就编译完了。编译完后,会在内核代码路径下的arch/arm/boot/路径下生成一个zImage文件,这就是编译好的内核文件。

4、在模拟机中加载内核

为了验证我们编译好的内核是否有效。可以做这样的试验:

首先,运行emulator,查看模拟手机上的settings里面的最后一项“About Phone”,查看Kernel Version一项(默认)

然后,运行带参数的emulator:

emulator -kernel ~/src/android/kernel/goldfish/arch/arm/boot/zImage // 把新生成的zImage内核文件作为参数

运行启动后,仍然查看settings里面的Kernel Version。是不是不一样了?哈哈!!