当前位置:文档之家› 在Ubuntu上编译android

在Ubuntu上编译android

在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源码。

相关主题