代码改变世界

Fedora16_x64编译Android4.0.3源码

2012-02-06 06:46  onm  阅读(322)  评论(0编辑  收藏  举报

这个勉强算是How,但是我无法准确的说出Fedora16编译Android4.0.3源码的整个过程,按步骤一步一步的该怎么做,因为我的编译过程是跌跌撞撞的,并且一些细节我可能现在写的时候也忽略甚至遗忘,我只是想分享编译Anrdoid源码过程中遇到的一些问题的解答,官方给出的编译流程对于Linux是针对Ubuntu发行版的,Fedora细节上有一些不同,以下内容大多并非原创,只是摘自网络,大多来自android-building group,更多问题或许可以在那找到答案。

准备工作,在编译源码之前,建议还是到andriod open source project上去看看,那里可以了解到一些基本的知识,尽管实践起来Fedora的一些细节可能不同,但是对于一些注意事项,基本的理解还是有好处的。另一方面,建议不要下载最新版本的android源码,而是下载稳定的branch,比如android-4.0.3_r1,这样可能会更顺畅一些。

在编译之前我们需要做一些准备,下载必要的开发包,这个链接http://rootzwiki.com/topic/8037-compile-android-on-fedora-1516-by-xoomdev/,说明了针对Fedora发行版的Linux操作系统该怎么做一些准备。

我简要叙述一下,

下载sun-java-jdk6,注意一定不要使用openjdk,如果使用openjdk之后的编译会出现问题。

cd ~/Downloads
sudo sh jdk-6u27-linux-amd64.rpm
sudo ln -s /usr/java/default/bin/javah /usr/bin/javah

然后安装必要的开发包

sudo yum install -y zip curl gcc gcc-c++ flex bison gperf glibc-devel.{x86_64,i686} \
zlib-devel.{x86_64,i686} ncurses-devel.i686 libX11-devel.i686 libstdc++.i686 libsx-devel \
readline-devel.i686 libXrender.i686 libXrandr.i686

sudo yum install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev \
gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev \
libx11-dev lib32readline5-dev lib32z-dev libX11-devel.i686

然后安装make3.81,(注意,Fedora16的make是3.82,编译Android会出现问题,所以需要降级安装3.81)

sudo yum downgrade make --releasever=13

但是按照这种降级方法我也没有安装成功,最后我选择了下载3.81版本的源码自己编译安装的,方法

http://www.gnu.org/prep/ftp.html下载"make-3.81.tar.gz到/tmp目录

su
cd /usr/local
tar -zxvf /tmp/make-3.81.tar.gz
cd ./make-3.81
./configure
./sh build.sh
./make install

然后配置PATH环境变量

PATH=$PATH:/usr/local/make-3.81
export PATH

(当然为了永久生效,可以放到~/.bashrc)

但是这样并没有好,Fedora16上一些包的版本和Android源码不太兼容,需要对Android源码作出一些更改,https://groups.google.com/forum/#!msg/android-building/gIC_t7GXzQ4/1l7Se9Mb910J这个链接给出了大部分方法,

1. in ./build/core/combo/HOST_linux-x86.mk
        replace : HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
        with    : HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

2. in ./development/tools/emulator/opengl/host/renderer/Android.mk
        add : LOCAL_LDLIBS += -lX11

3. in ./external/gtest/include/gtest/internal/gtest-param-util.h b/
include/gtest/internal/gtest-param-util.h
        after : [CODE]#include <vector>[/CODE]
        add : [CODE]#include <stddef.h>
                #include <cstddef>[/CODE]

4. in ./external/gtest/src/Android.mk
        replace (this is done in 2 places with the same line) :[CODE]LOCAL_CFLAGS += -O0[/CODE]
        with : [CODE]LOCAL_CFLAGS += -O0 -Wno-missing-field-initializers[/CODE]

5. in ./external/llvm/llvm-host-build.mk
        add : [CODE]LOCAL_LDLIBS := -lpthread -ldl[/CODE]

6. in ./external/mesa3d/src/glsl/linker.cpp
        after : [CODE]#include <climits>[/CODE]
        add : [CODE]#include <stddef.h>[/CODE]

7. in ./external/oprofile/libpp/format_output.h
        replace : [CODE]mutable counts_t & counts;[/CODE]
        with : [CODE]counts_t & counts;[/CODE]

8. in ./frameworks/compile/slang/slang_rs_export_foreach.cpp
        replace (line 249 - be careful, there are 2 line the same, the other
one is required) : [CODE]llvm::StringRef ParamName = PVD->getName();[/CODE]
        with :[CODE] // llvm::StringRef ParamName = PVD->getName();[/CODE]

另外我编译的过程还遇到了

host SharedLib: libGLES_CM_translator (out/host/linux-x86/obj/lib/libGLES_CM_translator.so)
/usr/bin/ld: skipping incompatible /usr/lib64/libGL.so when searching for -lGL
/usr/bin/ld: cannot find -lGLcollect2: ld 返回 1
make: *** [out/host/linux-x86/obj/lib/libGLES_CM_translator.so] Error 1
make: *** Waiting for unfinished jobs….

解决方法是

sudo yum install libgle.i686 libgle.x86_64 libgle-devel.i686 libgle-devel.x86_64 yum install mesa-libGL-devel.i686

又遇到

Java: CtsVerifier
(out/target/common/obj/APPS/CtsVerifier_intermediates/classes)
cts/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java:
191: onCreateDialog(int,android.os.Bundle) in android.app.Activity
cannot implement onCreateDialog(int,android.os.Bundle)
in com.android.cts.verifier.PassFailButtons.PassFailActivity;
attempting to assign weaker access privileges;
was public private static <T extends android.app.Activity &
PassFailActivity>
                           ^
1 error
make: ***
[out/target/common/obj/APPS/CtsVerifier_intermediates/classes-full- debug.jar]

有人说是使用openjdk,没有使用sun-jdk的原因,但是我使用的确实是sun-jdk,我采取了有人说的方案,从PassFailActivity接口中删除掉Dialog onCreateDialog(int id, Bundle args)

 

有了这些修补后,就可以正式开始编译了,

source build/envsetup.sh

lunch full-eng(注:这个属于没有设备专有驱动的配置,实际的机器比如Nexus S,你要到官网下载相应的驱动包,具体见这里

make -j4(注:-jN可以加快编译速度,但是数值不要过大,推荐值是电脑CPU线程的1或2倍)