Ubuntu11.10下编译android源码4.0.3

在以前的文章中,为读者介绍了《Ubuntu Linux下android源码下载方法》《Ubuntu11.10下配置android的Eclipse开发环境》以及配置过程当中遇到的一些问题,本文继续为你们介绍Ubuntu11.10下android源码4.0.3的编译方法。java

一、初始化编译环境python

软件需求:
Python2.5-2.7,能够http://www.python.org/download/下载(Ubuntu11.10自带)。
JDK6:编译Gingerbread或更新版本;JDK5:编译Froyo或更早版本。能够到http://java.sun.com/javase/downloads/下载,或经过Ubuntu软件中心下载更方便。
Git1.7或更新版本,能够到http://git-scm.com/download下载,或直接在终端下sudo apt-get install git下载便可。linux

安装JDK
在Ubuntu下安装JDK比较简单,能够在软件中心直接搜索安装,也能够按如下方法安装:
安装JAVA6:android

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

 安装JAVA5: git

$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse"
$ sudo apt-get update
$ sudo apt-get install sun-java5-jdk

 安装编译所需的软件包: shell

$ sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so

$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils xsltproc

 配置USB访问权限
在GNU/Linux系统下(特别是Ubuntu系统下),默认配置下普通用户不能直接访问USB设备,须要对系统进行一些配置。

以超级用户建立新配置文件/etc/udev/rules.d/51-android.rules,并将如下内容拷贝到新配置文件中:ubuntu

# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"

 而且将以上内容中的缓存

“<username>”

 修改成用户名,如修改成”Taskiller”。bash

二、配置ccache
ccache(“compiler cache”的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息, 好比头文件,这样就节省了一般使用cpp解析这些信息所须要的时间。若是您编译清单2中的文件,假定foobar.h中包含对其余头文件的引用,ccache会用那个文件的 cpp-parsed版原本取代include声明。ccache只是将最终的文本拷贝到文件中,使得它能够当即被编译,而不是真正去读取、理解并解释其内容。markdown

这一步是可选的。我在编译的时候没有配置ccache,最后的编译时间用了尼玛至少六个小时以上,虽然目前我尚未尝试过配置ccache后的编译速度,这里仍是建议读者配置一下,以节省编译时间,不要像我这么悲催。配置方法以下:
打开用户目录下的.bashrc,将下面语句添加到文件后面并保存退出:

export USE_CCACHE=1

 默认状况下cache(缓存)会保存在~/.ccache目录下,若是主目录位于NFS或其余非本地文件系统上,也要将下面语句添加到.bashrc中,以后保存并退出:

export CCACHE_DIR=<path-to-your-cache-directory>

 将

<path-to-your-cache-directory>修改成cache目录的位置。

 推荐的cache目录大小为50-100GB,在命令行执行如下命令:

prebuilt/linux-x86/ccache/ccache -M 50G

 该设置会保存到CCACHE_DIR中,且该命令是长效的,不会因系统重启而失效。

三、换用gcc与g++的较低版本

Ubuntu11.10自带的gcc与g++版本为4.6,用该版本编译android时会遇到一些错误,如:

host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner)
host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
<命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror]
<built-in>:0:0: 附注: 这是先前定义的位置
cc1plus:全部的警告都被看成是错误

 网上有文章说修改build/core/combo/HOST_linux-x86.mk文件,将

HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0

 修改为

HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

 这种方法虽然能解决该问题,但也会引出新的问题,还要继续不断的修改,很麻烦,并且也会破坏android源码的原生状态。可是若是使用4.4版本的gcc与g++,则不会出现这些错误,方法以下:

经过gcc -v命令能够发现gcc库在/usr/lib/gcc/i686-linux-gnu目录下,该目录下有当前系统支持的各类版本gcc库 。在安装gcc 4.4前该目录下是没有4.4目录的,安装gcc 4.4后该目录下就会多出4.4这个目录,且该4.4目录下有各类相应库文件。

ubuntu 32bit系统下安装gcc 4.4的最好方法是仅用如下两条命令,不须要其它命令,不然编译时可能会出错。

$sudo apt-get install gcc-4.4
$sudo apt-get install g++-4.4

 装完后进入到/usr/bin目录下

$ls -l gcc*

 会显示如下结果

lrwxrwxrwx 1 root root 7 2011-10-29 09:11 gcc -> gcc-4.6
-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4
-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6

发现gcc连接到gcc-4.6, 须要将它改成连接到gcc-4.4,方法以下:

$sudo mv gcc gcc.bak
$sudo ln -s gcc-4.4 gcc

 同理,对g++也作一样的修改:

$ls -l g++*

输出结果以下:

lrwxrwxrwx 1 root root 7 2011-08-14 15:17 g++ -> g++-4.6
-rwxr-xr-x 1 root root 228640 2011-10-06 05:45 g++-4.4
-rwxr-xr-x 1 root root 306200 2011-09-17 05:39 g++-4.6

须要将g++连接改成g++-4.4:

$sudo mv g++ g++.bak
$sudo ln -s g++-4.4 g++

 

再查看gcc和g++版本号:
gcc -v
g++ -v
均显示gcc version 4.4.6 ,说明gcc 4.4安装成功。

四、接下来即是对android源码进行编译

进入到源码目录,本人的目录为/home/tasiller/android/source。用envsetup.sh脚本初始化安装环境。可用如下代码:

$source build/envsetup.sh

 或

$. build/envsetup.sh

 注意.后面有一个空格。

以后,选择要编译的目标:

$lunch full-eng

 以后即是用make命令编译源码了:

$make -j4

 

这里-j4表示用四个线程编译,4表示线程数,读者可根据本身机器的状况设置(如机器为单CPU双核处理器,可设置为-j2或-j4,即该数为CPU内核总数或内核总数的2倍。)

以后就是漫长的等待了。。。

编译完成后,能够在源码目录的out/target/product/generic/目录下看到编译好的ramdisk.img、system.img和userdata.img了。  

欢迎你们到个人博客 http://taskiller.tk/坐坐
相关文章
相关标签/搜索