初始化编译环境
官方资料:
http://source.android.com/source/initializing.html
软件需求:
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下载即可。
安装JDK6
在ubuntu下可以通过多种方式来安装jdk,如使用Adept/新立得软件管理器在其中分别搜索"sun-java6-jre"和"sun- java6-jdk"并标记安装、通过apt-get命令来安装(sudo apt-get install sun-java6-jre、sudo apt-get install sun-java6-jdk)、同样也可以通过从java官网上下载jdk安装文件进行手动安装(我下载的文件是:jdk-6u20-linux- i586.bin),这也正是本文所要讲述的一种安装方法。
从官网下载下来的安装文件(如:jdk-6u33-linux-i586.bin)默认都是没有执行权限的,可以通过 $ls -l 命令查询到相关信息,所以首先第一步是要将安装文件赋予可执行权限,可以通过命令 $ sudo chmod u+x /usr/lib/java/jdk-6u20-linux-i586.bin 来实现。
成功修改安装文件权限后,通过命令 $ cd /usr/lib/java/ 进入安装文件所在目录,然后执行命令 $ ./jdk-6u33-linux-i586.bin 屏幕将会出现jdk安装的相关信息,然后一路回车,直至屏幕显示要求输入 yes/no,此时输入y并回车,当前目录下将会多出一个jdk1.6.0_33的目录,这也意味jdk已成功安装。
成功安装完JDK后,接下来我们将要进行JDK的配置,使用命 $ sudo gedit /etc/environment 对environment文件进行修改并添加以下代码:
PATH="/usr/lib/java/jdk1.6.0_33/bin"
CLASSPATH="/usr/lib/java/jdk1.6.0_33/lib"
JAVA_HOME="/usr/lib/java/jdk1.6.0_33"
若PATH已存在,则用冒号作间隔,将jdk的bin目录地址加上,这样java的环境变量将配置成功了,但这样默认使用的JDK可能还不是我们 刚才安装的,因为ubuntu可能还会有默认的jdk,如openjdk;所以,为了使默认使用的是我们安装的jdk,还需执行如下命令:
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/java/jdk1.6.0_33/bin/java 300
$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/java/jdk1.6.0_33/bin/javac 300
$ sudo update-alternatives --config java
成功执行命令后,我们安装的JDK就是系统默认的了,执行命令 $ java -version 就可以成功看到 JDK的相关信息了如:
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03)
Java HotSpot(TM) Server VM (build 20.8-b03, mixed mode)
其他安装jdk6的方法:http://www.cnblogs.com/bluestorm/archive/2012/05/10/2493592.html
安装编译所需的软件包:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386 $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
换用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
通过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++也做同样的修改,修改完成后再查看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
注意.后面有一个空格。之后,选择要编译的目标:
这里-j4表示用四个线程编译,4表示线程数,读者可根据自己机器的情况设置(如机器为单CPU双核处理器,可设置为-j2或-j4,即该数为CPU内核总数或内核总数的2倍。)
之后就是漫长的等待了。。。
编译完成后,可以在源码目录的out/target/product/generic/目录下看到编译好的ramdisk.img、system.img和userdata.img了。
提示错误及解决方法:
1、提示bits/predefs.h:没有那个文件或目录 错误的
输入sudo apt-get install gcc-multilib 即可
2、g++ selected multilib '32' not installed
sudo apt-get install g++-4.4-multilib
3、SDL_syswm.h:55: 致命错误
sudo apt-get install libx11-dev
4、/usr/bin/ld: cannot find -lz
sudo apt-get install lib32z1-dev
5、host C++: aidl <= out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp
g++: out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:No such file or directory
g++: no input files
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.o] Error 1
解决方案:
参考:http://topic.csdn.net/u/20100704/15/06d940c3-2ce9-4a15-a182-98a39c74f77a.html
6、/usr/include/features.h:324:10: fatal error: 'bits/predefs.h' file not found
#include <bits/predefs.h>
^
1 error generated.
make: *** [out/target/product/msm8660_surf/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/neonRuntimeMath.bc] 错误 1
解决方法:
参考链接:http://topic.csdn.net/u/20100704/15/06d940c3-2ce9-4a15-a182-98a39c74f77a.html
7、/usr/bin/ld: cannot find -lncurses
解决方法:apt-get install libncurses5-dev:i386