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倍)