这两天着手编译源码的准备工作,在此记录下过程,方便自己备份的同时也希望能对后来者有所帮助。
Attention:本文环境是在ubuntu 11.04下获取并编译android 2.3.3的源码,
过程参考了easwy的博文:http://www.2cto.com/kf/201111/110741.html
以及google官网http://source.android.com/source/downloading.html 。
官网上的要求信息为:
In general you will need:
• Python 2.4 -- 2.7, which you can download from python.org.
• JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. You can download both from java.sun.com.
• Git 1.5.4 or newer. You can find it at git-scm.com.
• (optional) Valgrind, a tool that will help you find memory leaks, stack corruption, array bounds overflows, etc. Download from valgrind.org.
另外补充:需要6GB以上磁盘空间,依赖的deb包:flex、bison、gperf、libsdl-dev、libesd0-dev、libwxgtk2.6-dev、build-essential、zip、curl
一、下载前准备工作
首先,准备好所需磁盘空间后,就来安装开发过程中需要的一些开发包,在终端中执行以下命令:
$ sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
在此处,需要注意两点:1.libsdl版本为1.2;2.zlib1g-dev别看错了是1而不是l,当然非手敲的tx就不存在这个问题了。
然后需要安装java环境,直接在终端查看下version:
wayne@ubuntu:~$ java -version
程序“java”已包含在下列软件包中:
* gcj-4.4-jre-headless
* gcj-4.5-jre-headless
* openjdk-6-jre-headless
请尝试:sudo apt-get install <选定的软件包>
输入:sudo apt-get install openjdk-6-jre-headless,安装就ok了,再查看下version:
wayne@ubuntu:~$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1)
OpenJDK Server VM (build 20.0-b11, mixed mode)
jdk就安装好了。
二、下载源码
现在我们已经准备好了android源码开发所需的环境(无错误),下载源码的过程由于Android的源码很是庞大,需要分Android源码和内核两部分获取。内核部分的源码我暂时是不用的,所以这里只下载源码。
1.先新建一个文件夹存放Android目录,并初始化repo:
wayne@ubuntu:~$ mkdir Android
wayne@ubuntu:~$ cd Android
wayne@ubuntu:~/Android$ mkdir bin
wayne@ubuntu:~/Android$ cd bin
wayne@ubuntu:~/Android/bin$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo >repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 19731 100 19731 0 0 14034 0 0:00:01 0:00:01 --:--:-- 17157
在这里,几个月前http://android.git.kernel.org/已经无法访问了,很多朋友如果用的是这个源下载站点,就会出现如下情况:
wayne@ubuntu:~/Android/bin$ curl http://android.git.kernel.org/repo >repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 244 100 244 0 0 75 0 0:00:03 0:00:03 --:--:-- 976
然后在之后的代码初始化时就会出现如下错误:
./bin/repo: 行1: 未预期的符号`newline' 附近有语法错误
./bin/repo: 行1: `<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">'
2.现在继续。建立存放源码目录source,初始化所需的android源码版本,在终端执行如下命令:
wayne@ubuntu:~/Android/bin$ sudo chmod a+x repo
wayne@ubuntu:~/Android/bin$ cd
wayne@ubuntu:~$ cd Android/source/
wayne@ubuntu:~/Android/source$ ../bin/repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.3_r1
gpg: 钥匙环‘/home/wayne/.repoconfig/gnupg/secring.gpg’已建立
gpg: 钥匙环‘/home/wayne/.repoconfig/gnupg/pubring.gpg’已建立
gpg: /home/wayne/.repoconfig/gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥920F5C65:公钥“Repo Maintainer <repo@android.kernel.org>”已导入
gpg: 合计被处理的数量:1
gpg: 已导入:1
Get https://android.googlesource.com/tools/repo
remote: Counting objects: 1414, done
remote: Finding sources: 100% (78/78)
remote: Total 1414 (delta 917), reused 1414 (delta 917)
Receiving objects: 100% (1414/1414), 429.88 KiB | 169 KiB/s, done.
Resolving deltas: 100% (917/917), done.
From https://android.googlesource.com/tools/repo
* [new branch] maint -> origin/maint
* [new branch] master -> origin/master
* [new branch] stable -> origin/stable
...www.2cto.com
这样下来之后,会要求输入用户名和邮箱地址,随意写个就ok。
初始化完毕之后会出现:
repo initialized in /home/wayne/Android/source
现在完成初始化之后便可以下载了,在终端执行如下命令,开始下载:
wayne@ubuntu:~/Android/source$ ../bin/repo sync
下载全部的源码需要很长时间,现在正在经历漫长的等待……
过程中时常看一下,也许会出错而中断:
error: Exited sync due to fetch errors
遇到这些问题时,重新执行一遍../bin/repo sync就ok。
二、源码编译
全部同步完毕后,进入到Android目录下,使用make命令编译,你会发现出现错误。
具体错误提示,依据你已安装的Ubuntu下的开发环境而定。
依次安装如下软件,如果已经安装,它会自动跳过。
sudo apt-get install zlib1g-dev
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install gperf
sudo apt-get install libsdl-dev
sudo apt-get install libesd0-dev
sudo apt-get install libncurses5-dev
sudo apt-get install libx11-dev
以上软件全部安装完毕后,运行make命令再次编译Android源码。
如果你本机上没有安装JDK,make时依然会报错。
可以从sun官方网站下载jdk-6u16-linux-i586.bin文件并安装它,但由于当天从sun网站下载过慢,我使用了“新得立”的软件安装工具,安装了default-jdk来代替。
配置JAVA_HOME和PATH环境变量,这里我将其全部添加在/etc/profile中尾部,然后source /etc/profile,如下:
JAVA_HOME=/usr/local/src/jdk_XXX
PATH=$PATH:$JAVA_HOME/bin:/usr/local/src/android-sdk-linux_x86-XXX/tools:~/bin
可以通过echo $JAVA_HOME 和echo $PATH进行测试,使用java -version得到提示,参照如下则成功:
java version "XXXX"
Java(TM) SE Runtime Environment (build XXX)
Java HotSpot(TM) Client VM (build XXX, mixed mode, sharing)
以上解决后,用make编译完整个项目后:
(如果你make的目录为~/android的话) 在 ./out/target/product/generic/下,会有几个需要的镜像文件,如下:
system.img
ramdisk.img
userdata.img
三、源码运行
在编译完整个项目后,如果我们需要观看编译后的运行效果,那么就需要在系统中安装模拟器android-sdk-linux_x86-XXX,这个SDK的下载地址为(可能以后会改变,只是提供参考):
http://developer.android.com/sdk/index.html (又被墙了,打不开,windows、linux、mac都在这)
本人解压到/usr/local/src/下,把/usr/local/src/android-sdk-linux_x86-XXX/tools目录加入系统变量PATH中。
同时,添加PATH
PATH=$PATH:$HOME/android/out/host/linux-x86/bin
my $HOME is /home/xxx/
接下来我们需要把android的镜像文件加载到emulator中,使得emulator可以看到android运行的实际效果,需要添加系统变量ANDROID_PRODUCT_OUT:
ANDROID_PRODUCT_OUT=$HOME/android/out/target/product/generic
export ANDROID_PRODUCT_OUT
然后source it。
下面就可以进入到模拟器目录中并启动模拟器
cd $HOME/android/out/target/product/generic
emulator -image system.img -data userdata.img -ramdisk ramdisk.img
本人使用VMBOX虚拟机,Ubuntu 11.04,16GB虚拟硬盘,512MB内存分配。
宿主机配置 2GB内存,2,33GHz Intel Core2 Duo CPU