在Ubuntu7.10上编译android1 概述上个星期看到android开放源代码的消息,虽然觉得Google的这个动作会对业界产生很大影响,但没有时间仔细看,只浏览了Project layout。
今天上午一个网友在mail中说已经编译、运行过android。
我趁着中午休息时间,在一个Ubuntu7.10的虚拟机上编译、运行了一下。
我在这个虚拟机上编译过openmoko、poky。
相对于这两个使用OpenEmbedded的平台,android的编译要简单一些,快一些。
我在编译openmoko和poky时,将所有下载包都保存在一个目录中,将编译目录的sources子目录指向这个目录。
这样做,一方面即使以后有些链接失效,也还可以编起来(其实编译时都不需要连接外网);另一方面在重新编译时,不用重新下载,可以加快编译速度。
即使这样,完全编译一次poky也要一个晚上。
编译android时,下载用了1个小时,编译也只需要1个小时。
2 编译中的两个小问题2.1 python和JDKGoogle网站对编译过程的介绍还是很清晰的。
不过在介绍其它软件包时,都给出了apt-get命令,却单独给出了python和JDK的链接地址,容易对读者产生误导,以为要手工安装这两个软件。
其实这两个软件也应该通过apt-get安装。
特别是python,如果从源代码安装,可能因为依赖其它软件,导致一些组件编译失败,影响android的编译。
而且python 2.6的源代码包没有提供make uninstall,卸载也比较麻烦。
其实我们只需要一个apt-get命令,就可以安装所有依赖的软件。
2.2 "fatal: git 1.5.4 or later required"在Ubuntu7.10上执行repo init时,会出现"fatal: git 1.5.4 or later required"的错误提示。
在Ubuntu8.04上编译没有这个问题。
下面的流程里会介绍怎样解决这个问题。
3 在Ubuntu7.10上的编译流程3.1 安装依赖的软件执行sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl python sun-java5-jdk valgrind3.2 安装脚本repocd ~mkdir binexport PATH=$PATH:~/bincurl /repo >~/bin/repochmod a+x ~/bin/repo将repo所在目录加到PATH后就可以在其它目录直接执行。
3.3 初始化代码仓库我把/ui/mydroid作为工作目录,创建目录后在这个目录执行:repo init -u git:///platform/manifest.git 如果返回"fatal: git 1.5.4 or later required",就执行3.4。
否则执行3.5。
3.4 “fatal: git 1.5.4 or later required”的解决3.4.1 删除git-core,添加apt源首先执行sudo apt-get remove git-core再编辑apt的源文件sudo vi /etc/apt/sources.list在最后添加deb /debian/ etch-backports maindeb-src /debian/ etch-backports main然后执行sudo apt-get update更新源。
这时如果出现没有公钥的错误提示:“由于没有公钥,下列签名无法进行验证:NO_PUBKEY EA8E8B2116BA136C”,就执行3.4.2。
否则执行3.4.3。
3.4.2 安装公钥执行gpg命令下载公钥:sudo gpg --keyserver --recv-keys EA8E8B2116BA136C sudo gpg --export -a EA8E8B2116BA136C > /tmp/key添加公钥:sudo apt-key add /tmp/key3.4.3 更新git-core执行:sudo apt-get updatesudo apt-get install debian-backports-keyringsudo apt-get updatesudo apt-get -t etch-backports install git-core然后再执行:repo init -u git:///platform/manifest.git应该就可以了。
3.5 下载代码执行repo sync下载代码。
我从13:30执行这条命令,14:30完成下载。
3.6 编译执行make编译。
我从14:30开始编译,15:40左右完成。
编译的最后输出是:Install system fs image: out/target/product/generic/system.imgTarget ram disk: out/target/product/generic/ramdisk.imgTarget userdata fs image: out/target/product/generic/userdata.img4 执行可以用模拟器运行一下刚才编译的映像。
从网上下载一个android-sdk-linux_x86-1.0_r1.zip,我将其放到~/android目录解压。
在路径中增加sdk的tools目录:export PATH=${PATH}:~/android/android-sdk-linux_x86-1.0_r1/tools通过环境变量告诉模拟器映像所在的目录:export ANDROID_PRODUCT_OUT=/ui/mydroid/out/target/product/generic最后执行:emulator就可以了。
可以用-skin参数选择皮肤。
sdk的tools/lib/images/skins目录中是sdk 自带的皮肤。
下面是两个运行的截图:相对于android的java框架,我更喜欢GTK和C。
但不得不承认android的UI比openmoko做得强多了。
5 结束语可以在~/.bashrc的最后添加:export PATH=${PATH}:~/bin:~/android/android-sdk-linux_x86-1.0_r1/tools export ANDROID_PRODUCT_OUT=/ui/mydroid/out/target/product/generic自动设置编译、运行环境。
这两天晚上正在改gsmd的中文短信bug,没时间仔细看android的编译系统,感觉上应该比OpenEmbedded简单。
其实OpenEmbedded用习惯了也不错,就是不够精简,速度慢一些,占用空间大一些。
编译android的工作目录有3.5个G。
我编译poky的目录有10.59个G,编译openmoko的目录有11.6个G。
一、获取Android源代码Git是LinuxTorvalds(Linux之父)为了帮助管理Linux内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。
在集中式版本控制系统中只有一个仓库(Repository),许多个工作目录(WorkingCopy),而在Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNUArch、Bazaar、Darcs、SVK、Monotone等),每一个工作目录都包含一个完整仓库,它们支持离线工作,本地提交可以稍后提交到服务器上。
因为Android是由Kernel、Dalvik、Bionic、Prebuilt、build等多个项目组成,如果我们分别使用Git来逐个获取显得很麻烦,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,使得项目的获取更加简单。
在Ubuntu 8.04上安装Git只需要设定正确的更新源,然后使用apt-get就可以了,apt-get 是一条Linux命令,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
apt-get命令一般需要root权限执行,所以一般跟着sudo命令。
sudo apt-get install git-core curl这条命令会从互联网的软件仓库中安装git-core和curl。
其中curl是一个利用URL语法在命令行方式下工作的文件传输工具,它支持很多协议,包括FTP、FTPS、HTTP、HTTPS、TELENT等,我们需要安装它从网络上获取Repo脚本文件。
curl/repo>~/bin/repo这句命令会下载repo脚本文件到当前主目录的/bin目录下,并保存在文件repo中。
最后我们需要给repo文件可执行权限chmod a+x ~/bin/repo接下来我们就可以利用repo脚本和Git、curl软件获取Android的源代码了:)首先建一个目录,比如~/android。
然后使用下面命令获取源码:repo init –u git:///platform/manifest.git这个过程会持续很长的时间(笔者下载了一天),下载完毕后会看到repo initialized in/android这样的提示,说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode。
如果我们想拿某个分支版本的代码,而不是主线代码,需要使用-b参数指定branch的名字,比如:repo init –u git:///platform/manifest.git –b cupcake如果我们只是想获取某一个project的代码,比如kernel/common,就不需要repo脚本了,直接使用Git工具即可,如果仔细研究repo脚本会发现,repo脚本其实就是组织Git工具去获取各个Project并把它们组织到同一个项目Android内。
git clone git:///kernel/common.git我们上面使用repo脚本获取了各个项目,那么接下来就需要把整个Android代码树同步到本地,如下:repo sync project1 project2 …笔者使用repo sync命令直接同步全部项目到本地。
二、源码编译全部同步完毕后,进入到Android目录下,使用make命令编译,你会发现出现如下错误提示:host C: libneo_cgi这个错误是因为我们缺少zlib1g-dev,需要使用apt-get命令从软件仓库中安装,如下:sudo apt-get install zlib1g-dev同理,我们还需要依次安装如下软件sudo apt-get install flexsudo apt-get install bisonsudo apt-get install gperfsudo apt-get install libsdl-devsudo apt-get install libesd0-devsudo apt-get install libncurses5-devsudo apt-get install libx11-dev以上软件全部安装完毕后,运行make命令再次编译Android源码。