Ubuntu11.10下编译android源码4.0.3

来源:岁月联盟 编辑:exp 时间:2012-01-12
在之前的文章中,为读者介绍了《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:
 
1 $ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
 
2 $ sudo apt-get update 
 
3 $ sudo apt-get install sun-java6-jdk
 
安装JAVA5:
 
1 $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"
 
2 $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse"
 
3 $ sudo apt-get update 
 
4 $ sudo apt-get install sun-java5-jdk
 
安装编译所需的软件包:
 
1 $ sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so 
 
2   
 
3 $ 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,并将以下内容拷贝到新配置文件中:
 
01 # adb protocol on passion (Nexus One) 
 
02 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
 
03 # fastboot protocol on passion (Nexus One) 
 
04 SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
 
05 # adb protocol on crespo/crespo4g (Nexus S) 
 
06 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
 
07 # fastboot protocol on crespo/crespo4g (Nexus S) 
 
08 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
 
09 # adb protocol on stingray/wingray (Xoom) 
 
10 SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
 
11 # fastboot protocol on stingray/wingray (Xoom) 
 
12 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
 
13 # adb protocol on maguro/toro (Galaxy Nexus) 
 
14 SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
 
15 # fastboot protocol on maguro/toro (Galaxy Nexus) 
 
16 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
 
17 # adb protocol on panda (PandaBoard) 
 
18 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
 
19 # fastboot protocol on panda (PandaBoard) 
 
20 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
 
并且将以上内容中的
 
1 “<username>”
 
修改为用户名,如修改为”Taskiller”。
 
2、配置ccache
ccache(“compiler cache”的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息, 比如头文件,这样就节省了通常使用cpp解析这些信息所需要的时间。如果您编译清单2中的文件,假定foobar.h中包含对其他头文件的引用,ccache会用那个文件的cpp-parsed版本来取代include声明。ccache只是将最终的文本拷贝到文件中,使得它可以立即被编译,而不是真正去读取、理解并解释其内容。
 
这一步是可选的。我在编译的时候没有配置ccache,最后的编译时间用了尼玛至少六个小时以上,虽然目前我还没有尝试过配置ccache后的编译速度,这里还是建议读者配置一下,以节省编译时间,不要像我这么悲催。配置方法如下:
打开用户目录下的.bashrc,将下面语句添加到文件后面并保存退出:
 
1 export USE_CCACHE=1
 
默认情况下cache(缓存)会保存在~/.ccache目录下,如果主目录位于NFS或其他非本地文件系统上,也要将下面语句添加到.bashrc中,之后保存并退出:
 
1 export CCACHE_DIR=<path-to-your-cache-directory>
 

 
1 <path-to-your-cache-directory>修改为cache目录的位置。
 
推荐的cache目录大小为50-100GB,在命令行执行以下命令:
 
1 prebuilt/linux-x86/ccache/ccache -M 50G
 
该设置会保存到CCACHE_DIR中,且该命令是长效的,不会因系统重启而失效。
 
3、换用gcc与g++的较低版本
 
Ubuntu11.10自带的gcc与g++版本为4.6,用该版本编译android时会遇到一些错误,如:
 
1 host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner) 
 
2 host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp 
 
3 <命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义[-Werror] 
 
4 <built-in>:0:0: 附注: 这是先前定义的位置 
 
5 cc1plus:所有的警告都被当作是错误
 
网上有文章说修改build/core/combo/HOST_linux-x86.mk文件,将
 
1 HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
 
修改成
 
1 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的最好方法是仅用以下两条命令,不需要其它命令,否则编译时可能会出错。
 
1 $sudo apt-get install gcc-4.4 
 
2 $sudo apt-get install g++-4.4
 
装完后进入到/usr/bin目录下
 
1 $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,方法如下:
 
1 $sudo mv gcc gcc.bak 
 
2 $sudo ln -s gcc-4.4 gcc
 
同理,对g++也做同样的修改:
 
1 $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:
 
1 $sudo mv g++ g++.bak 
 
2 $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脚本初始化安装环境。可用以下代码:
 
1 $source build/envsetup.sh
 

 
1 $. build/envsetup.sh
 
注意.后面有一个空格。
 
之后,选择要编译的目标:
 
1 $lunch full-eng
 
之后便是用make命令编译源码了:
 
1 $make -j4
 
这里-j4表示用四个线程编译,4表示线程数,读者可根据自己机器的情况设置(如机器为单CPU双核处理器,可设置为-j2或-j4,即该数为CPU内核总数或内核总数的2倍。)
 
之后就是漫长的等待了。。。
 
编译完成后,可以在源码目录的out/target/product/generic/目录下看到编译好的ramdisk.img、system.img和userdata.img了。
 
如非声明,本站文章均为Taskiller云宵阁 原创