现在的位置: 首页 > 综合 > 正文

[整]基于ubuntu 10.04(32位机)的Android2.2 源码编译

2013年10月12日 ⁄ 综合 ⁄ 共 5699字 ⁄ 字号 评论关闭

 

一、获取Android源代码

 


GitLinux TorvaldsLinux之父)为了帮助管理Linux内核开发而开发的一个开放源码的分布式版本控制软件,它不同于SubversionCVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(Repository),许多个工作目录(Working Copy),而在Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeperMercurialGNU ArchBazaarDarcsSVKMonotone等),每一个工作目录都包含一个完整仓库,它们支持离线工作,本地提交可以稍后提交到服务器上。

 

因为Android是由KernelDalvikBionicPrebuiltbuild等多个项目组成,如果我们分别使用Git来逐个获取显得很麻烦,所以Android项目编写了一个名为RepoPython的脚本来统一管理这些项目的仓库,使得项目的获取更加简单。

 

Ubuntu 8.04上安装Git只需要设定正确的更新源,然后使用apt-get就可以了,apt-get是一条Linux命令,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。

apt-get命令一般需要root权限执行,所以一般跟着sudo命令。

 

sudo apt-get install git-core curl

 

这条命令会从互联网的软件仓库中安装git-corecurl

 

其中curl是一个利用URL语法在命令行方式下工作的文件传输工具,它支持很多协议,包括FTPFTPSHTTPHTTPSTELENT等,我们需要安装它从网络上获取Repo脚本文件。

 

curl http://android.git.kernel.org/repo >~/bin/repo

 

这句命令会下载repo脚本文件到当前主目录的/bin目录下,并保存在文件repo中。

 

最后我们需要给repo文件可执行权限

 

chmod a+x ~/bin/repo

 

接下来我们就可以利用repo脚本和Gitcurl软件获取Android的源代码了:)

 

 

为repo命令修改环境变量,在.bashrc或/etc/profile 文件中加入如下:

sudo gedit /etc/profile
export PATH=$PTAH:~/bin/

 

 

首先建一个目录,比如~/myandroid。

然后使用下面命令获取源码:

 

mkdir myandroid

cd myandroid

 

 

repo init –u git://android.git.kernel.org/platform/manifest.git

 

repo sync

 

这个过程会持续很长的时间(笔者下载了一天),下载完毕后会看到repo initialized in /android这样的提示,说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode

 

如果我们想拿某个分支版本的代码,而不是主线代码,需要使用-b参数指定branch的名字,比如:

 

repo init –u git://android.git.kernel.org/platform/manifest.git –b cupcake

 

如果我们只是想获取某一个project的代码,比如kernel/common,就不需要repo脚本了,直接使用Git工具即可,如果仔细研究repo脚本会发现,repo脚本其实就是组织Git工具去获取各个Project并把它们组织到同一个项目Android内。

 

git clone git://android.git.kernel.org/kernel/common.git

 

我们上面使用repo脚本获取了各个项目,那么接下来就需要把整个Android代码树同步到本地,如下:

 

repo sync project1 project2 …

 

笔者使用repo sync命令直接同步全部项目到本地。

 

 


二、源码编译

 

全部同步完毕后,进入到Android目录下,使用make命令编译,你会发现出现如下错误提示:

 

host C: libneo_cgi <= external/clearsilver/cgi/cgi.c 
external/clearsilver/cgi/cgi.c:22:18: error: zlib.h: No such file or directory

 

这个错误是因为我们缺少zlib1g-dev,需要使用apt-get命令从软件仓库中安装,如下:

 

sudo apt-get install zlib1g-dev

 

同理,我们还需要依次安装如下软件

 

 

sudo apt-get install     gcc g++ flex bison gperf libsdl-dev libesd0-dev libwxgtk2.8-dev build-essential zip valgrind  zlib1g-dev libncurses5-dev libx11-dev

 

 

libsdl1.2-dev libsdl1.2debian

这是官方指引的包,还得增加一些包,要不然,之后还会报缺乏某些头文件之类的。

 

(/usr/include/gnu/stubs.h:9:27: error: gnu /stubs-64.h: 没有那个文件或目录)

sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6

 

 

以上软件全部安装完毕后,运行make命令再次编译Android源码。

 


这个时候你会发现出现很多java文件无法编译的错误,打开Android的源码我们可以看到在android/dalvik/libcore/dom/src/test/java/org/w3c/domts下有很多java源文件,这意味着编译Android之前需要先安装JDK

首先从sun官方网站下载jdk-6u22-linux-i586.bin文件并安装它。

 

 

【安装 JDK 1.6】

1.下载jdk

下载连接http://java.sun.com/javase/downloads/index.jsp 
选择jdk-6u22-linux-i586.bin下载,将jdk-6u22-linux-i586.bin放置于目录/home/h3/bin 

(注意改目录)

 

2.解压文件 
打开终端,进入放置jdk的目录[cd /home/h3/bin]; 
更改文件权限为可执行[sudo chmod u+x jdk-6u22-linux-i586.bin] 

或者[sudo chmod 701 jdk-6u22-linux-i586.bin]

 

3. 执行 bin 文件
sudo ./jdk-6u22-linux-i586.bin 就可以开始安装了

 设置JAVA环境

代码:
sudo gedit /etc/profile
在该文件中加入:
export JAVA_HOME=/home/h3/bin/java-1.6.0-22
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

如果你安装JDK 的目录不同我的,只要将第一行“=”后的路径改成你的安装目录路径即可,第 二、三行都不用修改
然后要系配置生 效,执行
代码:
source /etc/profile
可以用下面的命令查看是否成功
代码:
java -version
如果出现:
java version "1.6.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.60_22-b05)
Java HotSpot(TM) Client VM (build 1.6.0_22-b05, mixed mode, sharing)

 

 

 

【Update】

采用 JDK 1.6,需修改以下文件,暂时处理编译问题:

 

把external/clearsilver/cgi/Android.mk, external/clearsilver/java-jni/Android.mk, external/clearsilver/util/Android.mk, external/clearsilver/cs/Android.mk.
下面脚本中的ifneq改为ifeq可暂时回避问题
# This forces a 64-bit build for Java6
ifneq ($(filter 1.6%,$(java_version)),)
LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64
endif

 

【Update】

 

     Android文件系统由于已经自带了经过优化的交叉编译工具,并且为所有的源码都提供了经过验证的makefile,所以系统的整体编译相对简单,官方 发布的版本中基本功能都已经包含进了makefile中。如果需要增加什么功能,可以到 build/target/product/ 修改相应的.mk文 件。例如

为了增加中文的输入法,可以按下面的方法做:

    #cd /home/h3/myandroid/build/target/product/
#gedit generic.mk
打开这个文件后,在PRODUCT_PACKAGES中,加入PinyinIME,然后保存退出。这样在整体编译的时候就会把中文输入法也编译进 system中了。

 

 

 

 

 

三、开发工具 SDK 的编译

 

Android提供了完整的开发工具和交叉编译工具,这些都包含在了源码内,所以只要对源码正确编译,就可以获得丰富的开发工具,并且Android的移 植工作也需要这些工具的支持。
编译Android开发工具的步奏如下:
#cd /home/h3/myandroid/
#make sdk

  这次编译主要生成物件在out/host/下

#cd /out/host/linux-x86/sdk/
可以看到这里有了一个名叫android-sdk_eng.root_linux-x86的文件夹,这个文件夹基本包含了Android的模拟器      和所有的开发调试工具。打开这个文件夹,可以看到这里主要由以下几部分组成:
–add-ones –需要增加的新工具路径
–docs –关于模拟器和各种开发工具的说明等
–platform –模拟器和开发工具需要的文件
–tools –模拟器和开发工具的应用程序

 

 

 

 

 

四、测试编译结果

(方式:直接从 Android build system 环境下,测试;另,亦可通过 Android SDK 方式)

 

      找到编译后android的列表文档out,我们发现在 $ANDROID_CODE/out/host/linux-x86/bin 下多了很多应用程序,这些应用程序就是android得以运行的入门,所以我们需要把这个列表也添加到PATH下,在 /etc/profile 文档中加入如下内容:

 

export ANDROID_CODE=directory of your Android source code

export ANDROID_PRODUCT_OUT=$ANDROID_CODE/out/target/product/generic

export PATH=$PATH:$ANDROID_CODE/out/host/linux-x86/bin

 

执行 source /etc/profile  启用环境变量

 

  接下来我们需要把android的镜像文档加载到emulator中,使得emulator可以看到android运行的实际效果

  下面就可以进入到模拟器列表中并开启模拟器

  cd  $ANDROID_CODE/out/target/product/generic

  emulator -system system.img -data userdata.img -ramdisk ramdisk.img

 

 

 

 

 

 

五. 编译模块:

 

 修改了android的相关源代码后,在源代码的目录下,执行: . build/envsetup.sh (. 后面有空格)

     然后,进入到修改的源代码所属包的目录下,执行:mm

     在源代码的目录下,执行: make snod

           最后,在系统目录下,执行:emulator   ,就可以在模拟器上看到修改后的结果。

 

   android中的一个应用程序可以单独编译,编译后要重新生成system.img
在源码目录下执行
$ . build/envsetup.sh (. 后面有空格)
就多出一些命令:
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.
可以加—help查看用法
我们可以使用mmm来编译指定目录的模块,如编译联系人:
$ mmm packages/apps/Contacts/
编完之后生成两个文件:
out/target/product/generic/data/app/ContactsTests.apk
out/target/product/generic/system/app/Contacts.apk
可以使用
$ make snod
重新生成system.img,再运行模拟器

 

 

抱歉!评论已关闭.