Ubuntu系统下android源码下载与编译实例源码介绍



Ubuntu系统下android源码下载与编译实例源码介绍。用虚拟机来创建一个Ubuntu环境,在这里虚拟机用的是VMware,Ubuntu选择的是10.04版本,Android下载的是4.0.3编译时要确保系统的内存在1.2GM以上,否则编译经常会卡死在”target Dex: core“;虚拟机的磁盘空间也要足够大,给虚拟机分配20G磁盘空间肯定不行。磁盘编译时肯定会报“no space left on device”错误,一般给40G,如果磁盘空间够大,给虚拟机分配60个G。

关于内存与磁盘空间,Android官方是这样提示的:
Note: It is also possible to build Android in a virtual machine. If you are running Linux in a virtual machine, you will need at least 16GB of RAM/swap and 30GB or more of disk space in order to build the Android tree.(如果用虚拟机,要保证16G的swap空间和30G的硬盘空间)
一、获取Android源代码
因为Android是由Kernel、Dalvik、Bionic、Prebuilt、build等多个项目组成,如果我们分别使用Git来逐个获取显得很麻烦, 所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,repo用Python脚本写的调用git的一个脚本,主要功能是下载、管理Android项目的软件仓库。使得项目的获取更加简单。在Ubuntu 8.04上安装Git只需要设定正确的更新源,然后使用apt-get就可以了,apt-get是一条Linux命令,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
1、安装git和curl
进入Linux ,打开终端,在终端窗口敲下面的命令:
sudo apt-get install git-core curl
2、安装repo脚本
首先安装repo。在当前用户:~目录下新建一个bin目录。在终端中执行:
cd ~
mkdir bin
然后,向PATH中添加bin路径:
export PATH=$PATH:~/bin
然后执行下面两行指令,下载repo脚本并修改可执行属性:
curl https://android.git.kernel.org/repo>~/bin/repo
是通过cURL来下载Repo脚本,保存到~/bin/repo文件中
chmod a+x ~/bin/repo
给~/bin/repo赋给repo执行权限
3、初始化repo
首先建立一个目录用来存放Android源代码:
mkdir mydroid
cd mydroid
repo init -u git://android.git.kernel.org/platform/manifest.git
把Android当前主线上最新版本的所有的sourcecode拿下来
如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如:
repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
4、同步版本
使用repo sync命令,就可以把整个Android代码树做同步到本地
能还有经历下载中断的情况,这时只要重新执行repo sync就可以了。
如果是第一次运行 repo sync , 则这个命令相当于 git clone ,会把 repository 中的所有内容都拷贝到本地。 如果不是第一次运行 repo sync , 则相当于 git remote update ; git rebase origin/branch . repo sync 会更新 .repo 下面的文件。 如果在merge 的过程中出现冲突,这需要手动运行
git rebase –continue

二、编译Android源代码
1、安装java
android2.3以上版本下载jdk6,android2.3以下版本下载jdk4.
jdk6是通过手动解压安装的。先到官方网站下载一个jdk6的安装包,
jdk5的url如下:

http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-linux-i586.bin

jdk6的url如下:

http://download.oracle.com/otn-pub/java/jdk/6u43-b01/jdk-6u43-linux-i586.bin


1)下载完成后即安装
sudo chmod +x jdk-6u43-linux-i586.bin
sudo ./jdk-6u43-linux-i586.bin
2)设置java环境
修改.bashrc文件,在.bashrc文件末尾加入
#set java environment
export JAVA_HOME=/home/mfcai/jdk1.6.0_22
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
3)设置完成后重启,或者在console下运行source ~/.bashrc
4)安装必须的包
sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils xsltproc
有些包可能安装不了,跳过去,不用管。

2、编译源码
切换到android源码根目录下,执行$sudo make即可。首次编译非常耗时,取决于机器配置,但这个过程真的很漫长。编译成功后,终端会如下提示:
Generated: (out/target/product/generic/android-info.txt)
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
Installed file list: out/target/product/generic/installed-files.txt
完成后镜像生成在/mfcai/mydroid/out/target/product/generic下
编译完成后会生成了一个out 目录,编译成功会会再源码目录下生成一个out文件夹,大小有12G,所有所在的挂载区剩余空间最好大于20G。out文件夹如下所示:
out/
– CaseCheck.txt
– casecheck.txt
– host
– common
– linux-x86
– target
– common
– product
主要的两个目录为host 和target
1)前者表示在主机(x86)生成的工具
2)后者表示目标机(模认为ARMv5)运行的内容。
host目录的结构如下所示:
out/host/
– common
– obj (JAVA库)
– linux-x86
– bin (二进制程序)
– framework (JAVA库,*.jar文件)
– lib (共享库*.so)
– obj (中间生成的目标文件)
/out/host/:该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等。

target目录的结构如下所示:
out/target/
– common
– R (资源文件)
– docs
– obj (目标文件)
– product
– generic
/out/target/common/:该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库。
/out/target/product/<product_name>/:包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,<product_name>是具体目标设备的名称。
在默认的情况下,Android编译将生成generic目录,generic包含了以下内容:
out/target/product/generic/
– android-info.txt
– clean_steps.mk
– data
– obj
– ramdisk.img
– root
– symbols
– system
– system.img
– userdata-qemu.img
– userdata.img
在generic/obj/APPS目录中包含了各种JAVA使用,与common/APPS相对应,但是已经打成了APK包。
system目录是主要的文件系统,
data目录是存放数据的文件系统。
obj/SHARED_LIBRARIES中存放所有动态库。
obj/STATIC_LIBRARIES中存放所有静态库。
以img为结尾的文件是目标映像文件,其中ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把system和userdata分别加载到ramdisk文件系统中的system和userdata目录下
make编译的并不是所有内容,不包含内核和SDK。

三、编译、配置Android SDK
make PRODUCT-sdk-sdk
编译完成后会生成sdk和android.jar
SDK所在目录为
out/host/linux-x86/sdk/,生成的sdk文件目录和压缩包为:
android-sdk_eng.xxx_linux-x86
android-sdk_eng.xxx_linux-x86.zip(xxx为自己android源码所在的文件名)
比如,我的sdk文件目录是:android-sdk_eng.mfcai_linux-x86
android.jar文件所在的目录为
/out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar
并在/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src目录下重新以package形式组织所有生成到android.jar中的源代码。

问题1
有可能会出现:“Permission denied (权限拒绝的提示)”异常。 请命令
解决办法:赋予权限
$sudo chmod -R a+rwx *

四、运行android模拟器
1、在 ~/.bashrc 加环境变量。
gedit ~/.bashrc
打开.bashrc,在.bashrc文件的最后面加入如下3行(Android工具的路径)
export PATH=/home/mfcai/myandroid/out/host/linux-x86/bin :$PATH
export ANDROID_PRODUCT_OUT=/archer/external/android/out/target/product/generic
export ANDROID_SWT=/android/out/host/linux-x86/framework
2.创建Android虚拟设备
./android create avd -t 15 -n g15
-t 指定TargetID (Android 4.0.3 SDK的ID为15),-n指定创建的Android虚拟设备名字。
3.运行emulator
./emulator -avd g15
进入模拟器程序所在目录,我的模拟器所在目录是:/home/mfcai/myandroid/out/host/linux-x86/bin
cd ~/myandroid/out/host/linux-x86/bin
使用android list targets命令来查看当前系统中的android模拟器,
./android list target
问题1:
有可能会出现如下异常:SWT folder ‘/root/dsk/android/out/host/linux-x86/framework/x86′ does not exist.
Please export ANDROID_SWT to point to the folder containing swt.jar for your platform.
意思是需要指向SWT.jar所在的目录。
解决办法:在.bashrc文件中加入下面一行:
export ANDROID_SWT=/home/mfcai/icecreamsu/out/host/linux-x86/framework
问题2:
有可能会出现如下异常:curl: (7) couldn’t connect to host
1)有可能是网络原因,多试几次
2)有可能是防火墙原因,先把防火墙关了
3)如果上面两种方法,还都不成功,可能需要重新安装repo脚本:
curl “http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo” > ~/bin/repo
chmod a+x ~/bin/repo
PATH=~/bin:$PATH
然后再进入mydroid,执行:
repo init -u git://codeaurora.org/platform/manifest.git -b gingerbread
repo sync -j4