64位UbuntuKylin14下编译安卓2.3.3过程记录


由于国内的网络环境,上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_45
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export 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 Library
try this
sudo apt-get install libx32gcc-4.8-dev
sudo 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 lookup
frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1
Fix:
vi frameworks/base/tools/aapt/Android.mk
Add '-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 lookup
frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/AssetManager.o] Error 1
Fix:
vi frameworks/base/libs/utils/Android.mk
Add '-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’ instead
make: *** [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] Error 1
Fix:
cd external/srec
wget "https://github.com/CyanogenMod/android_external_srec/commit/4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff"
patch -p1 < 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
rm -f 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
cd ../..


[8] /usr/bin/ld: cannot find -lncurses
host Executable: adb (out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb)
/usr/bin/ld: cannot find -lncurses
collect2: ld returned 1 exit status
make: *** [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] 
错误 1
Fix:
gcc g++版本过高,应该都降级为4.4才行
版本切换见http://www.linuxboy.net/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.h
Fix:sudo apt-get install libswitch-perl 


 

相关内容