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

1、初始化编译环境

软件需求:
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下载即可。

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

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

安装JAVA5:

$ 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

安装编译所需的软件包:

$ 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,并将以下内容拷贝到新配置文件中:

# 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”。

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

这一步是可选的。我在编译的时候没有配置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中,且该命令是长效的,不会因系统重启而失效。

3、换用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安装成功。

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/坐坐

更多相关文章

  1. mac终端配置Android(安卓)ADB命令
  2. win8下Android(安卓)SDK环境变量安装
  3. Android(安卓)Studio文件分组插件
  4. Android查看Apk签名
  5. AndroidManifest.xml设置程序安装的路径
  6. 软件安装:android studio安装以及操作手册
  7. 一些安卓的基本权限 清单配置文件
  8. 如何将编译好的apk文件加入Android系统?
  9. Android(安卓)利用dropbear工具 配置ssh服务

随机推荐

  1. android实现 服务器功能
  2. Android获取网络视频文件缩略图
  3. Android 3.0 http网络请求
  4. android 状态栏与标题栏一体化
  5. android MAT使用
  6. android的PowerManager和PowerManager.Wa
  7. Android Webview 获取网页form 提交的数
  8. 【收藏】Android(安卓)AutoLayout全新的
  9. Android NullPointerException at androi
  10. Android开发—弹出列表、单选、多选框