一.概述。
此文讲述在windows操作系统下,在虚拟机软件上安装linux操作系统,配置此虚拟机上的linux操作系统来编译android系统源码。操作系统用Windows XP或 Windows 7都可以,虚拟机我用的VMware9.0正式版,linux系统用的Ubuntu12.04的64位版本。
二.下载及安装VMware9.0正式版。
随便在网上搜索一个VMware9.0的下载站,例如http://www.crsky.com/soft/1863.html(非凡软件站),由于是官方正式版,安装时需要序列号,可以网上搜索一个序列号用就可以了。
软件下载完毕后,不要急着安装,先确认下CPU是否支持64位(由于安装的是Ubuntu的64位版本,必须CPU支持64位)。可以在网上找一个查看CPU信息的软件,如CPU-Z这个软件(下载地址例如:http://www.onlinedown.net/softdown/2775_2.htm,华军软件园),下载安装好CPU-Z这个软件后打开程序,在处理器页中的指令集一栏中看有没有64相关的数字,如EM64T,如果有的话说明CPU是支持64位的,那直接安装VMware就可以了。如果不支持64位,那继续看看指令集中有没有VT-x这一项,如果没有,那就只能换电脑了,如果有的话,说明还可以用虚拟技术来实现64位,虚拟需要进入电脑的BIOS设置中的处理器设置,把处理器虚拟技术打开,例如我电脑BIOS设置中有一项“Intel虚拟技术”,把这项设置为开启,然后重启电脑就可以装VMware了(如果之前已经安装过VMware,那必须卸载,设置了CPU虚拟技术后再重新安装)。
三.下载及安装Ubuntu12.04的64位版。
由于目前多数android源码的新版本都只支持64位linux环境下编译,所以这里选择下载64位的Ubuntu,12.04是Ubuntu的一个长期支持版本,android的编译在此版本上也经过测试,所以推荐下载Ubuntu12.04的64位版本,官网的下载地址为http://www.ubuntu.com/download/desktop。
下载好后,就可以打开VMware来开始准备安装Ubuntu了。在VMware中选择创建新的虚拟机,然后按照提示,选择镜像文件为刚刚下载好的Ubuntu12.04,其他选项一般按默认配置点击下一步就行了。在其中配置虚拟机的那一项可以做些修改,例如内存我改为了1536MB即1.5GB,处理器选择2核,硬盘为120GB。最后等待安装就可以了,时间可能有点长,可能一小时左右吧。
安装好Ubuntu后,还可以安装VMware Tools,用于方便在虚拟机上的Ubuntu系统和本机Windows系统间直接进行文件传输及复制粘贴等操作,文件传输时就好像系统的两个文件夹间传递文件一样,可以直接用鼠标拖拽文件,非常方便。安装方式为,在VMware中右键单击My Computer列表中的Ubuntu系统,选中最后一项Install VMware Tools,然后会先自动下载VMware Tools的.iso文件,下载好的文件为在VMware的安装目录下的linux.iso这个,如果下载好后不能自动安装VMware Tools,则可以先关闭虚拟机上的Ubuntu系统,然后在VMware中对Ubuntu系统硬件配置做个修改,在其中的CD/DVD(IDE)选项中,将connection下选为Use ISO image file,并且选择刚刚下载好的linux.iso文件,然后确认保存,重新打开Ubuntu系统,Ubuntu系统启动好应该就能自动安装成功VMware Tools的。
四.Android主要编译工具安装。
这里安装的内容在android open source官网中有介绍(官网地址为:http://source.android.com/source/initializing.html),其中有关于Ubuntu12.04版本需要安装的内容,主要有两步:
1.打开Ubuntu系统的命令行终端,输入以下内容:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
回车确认后输入Ubuntu系统的密码及按照提示输入“y”之类的确认就行,如果网络没问题的话一般等一段时间就可以安装完了,最后可能会有个错误提示,内容有让你尝试“sudo apt-get –f install”之类的,如果遇到这个情况,那么直接在终端中输入“sudo apt-get -f install”后回车就行了。
2.上一步安装完成后,在终端中输入以下命令:
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
五.安装java的jdk 2.6版本。
1.下载:目前android的源码编译需要用到java的官方jdk2.6版本,否则会出现编译错误,编译无法成功。首先下载jdk2.6版本的.bin安装文件,下载地址为http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u34-oth-JPR,选择其中的jdk-6u34-linux-x64.bin(即jdk2.6.34的64位linux版)下载。(下载时候还需要oracle的账号,按照提示注册一个oracle账号后登录就可以下载jdk了)
2.配置:上一步中下载好的jdk文件一般是在Ubuntu系统的主文件夹下的“下载”或“Download”文件夹中,确认下载完成后,在终端中依次输入以下命令:
cd /usr/lib/jvm
sudo cp /home/carter/下载/ jdk-6u34-linux-x64.bin /usr/lib/jvm(命令的前部分即为上一步中下载好的jdk文件所在目录,每个人电脑主机名都不一样,所以这里的路径要对应改为自己的,不能直接拷贝这里的“/home/carter/下载”)
sudo chmod a+x jdk-6u34-linux-x64.bin
sudo ./ jdk-6u34-linux-x64.bin
sudo mv jdk1.6.0_34/ java-1.6.0_34-sun/
sudo ln -s java-1.6.0_34-sun java-6-sun
sudo rm jdk-6u34-linux-x64.bin
然后输入sudo gedit /etc/environment,会打开一个文本文件,将其内容修改为:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-6-sun/bin"
JAVA_HOME="/usr/lib/jvm/java-6-sun"
CLASSPATH="/usr/lib/jvm/java-6-sun/lib"
保存文件并关闭,接着输入以下命令:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-6-sun/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/java/java-6-sun/bin/javac 300
sudo update-alternatives --config java
之后会在终端中显示一些内容,按照提示选择其中第2项,即输入数字2然后回车就可以了。接着可以在终端输入java –version来查看下刚刚配置的java信息。
六.将gcc、g++的版本由4.6改为4.4。
在第四步中安装命令执行后默认安装的是gcc跟g++的4.6版本,但目前android的编译用4.6版本太高了,只能用4.4版本。首先下载安装gcc和g++的4.4版本:
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4
安装完成后输入:
cd /usr/bin
ls –l gcc*
内容显示为:
lrwxrwxrwx 1 root root 7 2011-10-29 09:11 gcc -> gcc-4.6
-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4
-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6
从内容中可看出gcc命令链接到的是gcc-4.6版本,需要修改:
sudo mv gcc gcc.bak
sudo ln –s gcc-4.4 gcc
同样g++的版本也要改为4.4版本:
sudo mv g++ g++.bak
sudo ln –s g++-4.4 g++
最后再安装下g++-4.4-multilib:
sudo apt-get install g++-4.4-multilib
七.下载android系统源代码。
1.安装Repo:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo
2.下载代码:
在文件系统主文件夹下建一个文件夹来存储源代码,例如我建了一个work文件夹,然后在下面建一个4.0.3的文件夹用来准备下载android4.0.3的源码。之后在命令行终端中cd跳转到此文件夹路径下,然后分别输入以下两个命令:
repo init -u https:// android.googlesource.com/platform/manifest -b android-4.0.3_r1(这里我是准备下4.0.3版本的源码,所以-b后面跟着的是android-4.0.3_r1,如果需要下别的版本,将-b后面的内容换为对应版本名就可以了,或者不加-b及后面的参数,那就默认下载master的分支,master分支代表google发布的android的最新版本)
repo sync
以上两条命令中,前一个为初始化要下载的代码路径,后一个为真正执行下载的命令,在执行repo sync命令下载源码时,如果出现网络中断或者其他原因导致命令行终端卡住了或者一直没下载到代码(可通过360安全卫士看是否有网络流量来判定),那就在终端中输入ctrl+Z来取消,取消后再重新输入repo sync会接着继续之前的下载的,整个工程源码比较大,5G左右吧,下载时间比较长,可能要一整晚,最后如果提示syncing work tree done之类应该就说明源码下载完成了。
八.编译android系统源码。
1.swap分区调整:
第一次刚刚下好android系统源码时,要先全编译一次,否则无法执行其他编译单个app等命令,编译前最好先配置下swap分区,否则有可能会编译不通过。在终端中输入命令free -m,会显示swap分区的信息,如Swap:1533 0 1533之类的,可以看出我这里的swap分区大小是1533M,我第一次编译时候可能由于swap分区太小编译没有通过,后来我就把swap分区增加了1G,就编译通过了,增加分区方式如下:
首先在主文件夹下建一个swap文件夹,然后在命令行终端中cd到此文件夹下,执行命令sudo dd if=/dev/zero of=swapfile bs=1024 count=1000000(bs单位为字节,count为数目,即分配一个1024*1000000B=1GB的swapfile文件)。接着执行命令sudo mkswap swapfile,最后执行sudo swapon swapfile。然后查看输入free –m重新查看swap信息,已经变为,Swap:2510 0 2510了,说明我的swap分区增加了大概1G,即增加swap分区成功。不过sudo swapon swapfile这个命令只是临时的增加swap分区,如果Ubuntu系统重启后,就会失效了,这时候free -m查看会发现swap又变回了1533,这个时候就要重新cd到swap文件夹下,重新执行下sudo swapon swapfile这个命令。如果嫌麻烦,不想每次重新启动系统后都要重新增加下swap分区,可以通过把swap文件写入/etc/fstab文件中来保存效果。我个人只是全编译一次系统源码,之后只编译部分的app,所以我只在第一次全编译系统时候增加了swap分区,后面就没管过了,编译app等小模块时候不增加swap分区也是可以通过的,所以就没研究怎么把swap文件一直保持。
2.全编译整个android系统源码:
以上各步骤都完成后,在命令行终端中cd到下载好的android4.0.3源码文件夹下,执行命令source build/envsetup.sh,接着执行lunch full-eng,最后执行make。
整个编译过程有点长,可能 4 小时左右吧,具体看电脑配置情况了。这里我的编译命令用的是 make ,而不是 make –j4 之类的,在网上找的文章中,有的人说直接用 make 命令编译会好些,用 make –j4 可能编译不通过,而我第一次编译时没有增加 swap 分区,编译命令用的 make –j4 ,最后编译没成功,不确定是因为没有增加 swap 分区还是这里用的命令不对,所以我两个都改了,增加了 swap 分区,这里命令也改为直接用 make 。整个系统源码编译成功,以后就可以用 mmm 命令来单独编译某个 app 了,如果以后在编译单个 app 时提示 mmm 命令无法找到之类的,那就先执行下 source build/envsetup.sh ,再用 mmm 编译就会成功了。我在编译 android4.0.1 整个源码时候是可以成功的,但后来编译 4.0.3 的源码时有遇到个错误,不知道是官方的 4.0.3 的代码有问题还是我有些地方没配置好,最后在网上搜索了下别人提供的解决方案。如果大家在编译 4.0.3 的源码时遇到有报 cts/apps/CtsVerifier…… 中 T extends android.app.Activity 相关错误的,可以按照这个方法来解决:修改源码根目录下的 cts 文件夹下的 Android.mk 文件,将文件中的两行命令都用 # 注释掉,修改好后重新执行 make 命令应该就能通过编译的。 make 命令在编译过程中如果报错,改正错误代码后重新执行 make 命令是可以接着编译的,不用担心又会重新编译整个源码。