Ubuntu 12.04 中android4.0 源码编译环境搭建

初始化编译环境

官方资料:

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

  这种方法虽然能解决该问题,但也会引出新的问题,还要继续不断的修改,很麻烦,而且也会破坏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++也做同样的修改,修改完成后再查看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

 

  注意.后面有一个空格。之后,选择要编译的目标:

    choosecombo  1 15 3
                
  之后便是用make命令编译源码了:
     make -j4
 

  这里-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

 


 

本文参考链接: http://www.59a.cn/819.Shtml
 
 

你可能感兴趣的:(ubuntu 12.04)