由于国内的网络环境,上google成为一件蛋疼的事,就单单一个2.3版本的源代码就下载了好几天,当然前提除了hosts文件外没用其他任何工具,hosts时不时需要更新才能正常的访问google,编译过程中报了很多错,基本上前人都遇到过,只要有耐心去查,google和baidu交叉使用,基本都能找到解决方法,其中最蛋疼的应是Ubuntu版本,经历了这么一次后,个人觉得编译安卓Ubuntu版本应该选择安卓对应版本当时的Ubuntu版本,否则会有一些意想不到的问题
上google的方法
google-hosts
源码的获取参考下面两个链接
google源码获取官方示例
源码获取 指定-b 分支可下载对应版本的源码
Ubuntu14 环境初始化
Installing required packages (Ubuntu 14.04)Building on Ubuntu 14.04 is experimental at the moment but will eventually become the recommended environment.$ sudo apt-get install bison g++-multilib git gperf libxml2-utils
遇到的错误及解决方法,部分错误未记录
[1]Your version is: java version "1.6.0_24".The correct version is: Java SE 1.6.1.设置jdk环境变量编译android源码只支持jdk 1.6,所以如果需要编译源码必须下载jdk 1.6,不能下载最新的jdk 1.7,如果不需要编译源码则可以下载1.7版本的。1.6版本jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html不要把环境变量配置在/etc/environment和/etc/profile文件中,这样配置的在有的ubuntu版本上会出现退出当前终端后不起作用的问题,在ubuntu12.04上我就遇到了此问题。把环境变量配置在用户目录.bashrc文件中是最好的选择。export JAVA_HOME=/home/abc/jdk1.6.0_45export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/binexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib然后执行source .bashrc使配置生效即可。[2]/usr/include/features.h:356:25: 致命错误: sys/cdefs.h:没有那个文件或目录To compile 32 bit binaries on 64 bit Linux version, you have to Install libx32gcc development package and 32 bit GNU C Librarytry thissudo apt-get install libx32gcc-4.8-devsudo apt-get install libc6-dev-i386[3]致命错误: zlib.h:没有那个文件或目录下面这个错误是因为zlib包没有安装,安装后问题即可解决。但有一点请注意安装命令是:sudo apt-get install zlib1g-dev,而非sudo apt-get install zlib./file_util.cpp:19:18: 致命错误: zlib.h:没有那个文件或目录编译中断。sudo apt-get install zlib1g-dev
[4]一个问题是有一处少了一个头文件,原因是zlib1g-dev有个头文件修改了路径,及zconf.h放到了/usr/include/x86_64-linux-gnu/,所以将其拷贝到/usr/include/下即可了In file included from system/extras/ext4_utils/output_file.c:30:/usr/include/zlib.h:34: fatal error: zconf.h: 没有那个文件或目录compilation terminated.[5] Error:frameworks/base/include/utils/KeyedVector.h:193:31: note: declarations in dependent base ‘android::KeyedVector<android::String8, android::sp<AaptDir> >’ are not found by unqualified lookupframeworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ insteadmake: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1Fix:vi frameworks/base/tools/aapt/Android.mkAdd '-fpermissive' to line 31:LOCAL_CFLAGS += -Wno-format-y2k -fpermissive[6] Error:frameworks/base/include/utils/KeyedVector.h:193:31: error: ‘indexOfKey’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]frameworks/base/include/utils/KeyedVector.h:193:31: note: declarations in dependent base ‘android::KeyedVector<android::String8, android::wp<android::AssetManager::SharedZip> >’ are not found by unqualified lookupframeworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ insteadmake: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/AssetManager.o] Error 1Fix:vi frameworks/base/libs/utils/Android.mkAdd '-fpermissive' to line 64:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive[7] Error:external/srec/tools/thirdparty/OpenFst/fst/lib/cache.h:136:11: note: use ‘this->SetState’ insteadmake: *** [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] Error 1Fix:cd external/srecwget "https://github.com/CyanogenMod/android_external_srec/commit/4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff"patch -p1 < 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diffrm -f 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diffcd ../..[8] /usr/bin/ld: cannot find -lncurseshost Executable: adb (out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb)/usr/bin/ld: cannot find -lncursescollect2: ld returned 1 exit statusmake: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1解决方法:sudo apt-get install libncurses5-dev(32位系统)sudo apt-get install lib32ncurses5-dev(64位系统)[9] 错误1:out/host/linux-x86/obj/SHARED_LIBRARIES/libdvm_intermediates/native/dalvik_system_Zygote.o解决方法:vim dalvik/vm/native/dalvik_system_Zygote.c #include "Dalvik.h"#include "native/InternalNativePriv.h"下面加上一行:#include <sys/resource.h>[10]make: *** [out/host/linux-x86/obj/EXECUTABLES/mksnapshot_intermediates/src/accessors.o] 错误 1Fix:gcc g++版本过高,应该都降级为4.4才行版本切换见http://www.linuxidc.com/Linux/2012-10/72284.htm如果源里没有gcc4.4,则切换到163的源$sudo apt-get install gcc-4.4$sudo apt-get install gcc-4.4-multilib$sudo apt-get install g++-4.4$sudo apt-get install g++-4.4-multilib$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60$sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 40$sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 60$sudo update-alternatives --config gcc$sudo update-alternatives --config g++ Selection Path Priority Status------------------------------------------------------------* 0 /usr/bin/g++-4.6 60 auto mode 1 /usr/bin/g++-4.4 40 manual mode 2 /usr/bin/g++-4.6 60 manual mode选择1.如果想改为高版本的随时用update-alternatives --config 命令切换!修改后第一次编译仍然存在错误,第二次编译就没有错误了,具体原因我也不清楚。
[11] out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/HTMLNames.hFix:sudo apt-get install libswitch-perl