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

Ubuntu12.04下编译android源码4.0.3

2013年10月08日 ⁄ 综合 ⁄ 共 6158字 ⁄ 字号 评论关闭

1、初始化编译环境

软件需求:
Python2.5-2.7,可以http://www.python.org/download/下载(Ubuntu12.04自带)。
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.由于版权问题,现在的ubuntu中已经不带有sun的jdk源了

找到一个可用的sun-java6-jdk源: 

$ sudo gedit /etc/apt/sources.list                                   #root权限使用gedit编辑sources.list内容

 

文档末尾复制粘帖以下内容,然后保存并关闭文件:

deb http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse

2.更新源内容并安装sun-java6-jdk


$ sudo apt-get update                                   #更新源及可用软件包内容
$ sudo apt-get install sun-java6-jdk               #安装sun-java5-jdk,过程中需要阅读许可并键入“y”同意

 

 

安装编译所需的软件包:

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安装成功。

 

提示bits/predefs.h:没有那个文件或目录 错误的

输入sudo apt-get install gcc-multilib 即可


g++ selected multilib '32' not installed

sudo apt-get install g++-4.4-multilib

 

SDL_syswm.h:55: 致命错误

sudo apt-get install libx11-dev

 

/usr/bin/ld: cannot find -lz

sudo apt-get install lib32z1-dev

 

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了。

抱歉!评论已关闭.