这段时间因为实验需要,所以编译了Android4.0和4.2.2系统源码,网上也有些教程,不过都多多少少有些错误,另外就是由于每个人编译时环境的差别等,具体的过程和遇到的错误可能不一样,不过大致的过程还是一样的,我就把我这编译时的步骤和遇到的一些问题列出来吧~
1. 安装Ubuntu12.04 64位,我是在virtualbox下虚拟安装的,具体过程自行百度~
2.下载源码,我没有用vpn,直接在网上搜到的源码包,感谢万能的百度云~
3.安装jdk.我用的是jdk1.6.0_45,用openjdk会有问题的,如果Ubuntu中自带了openjdk, 需要卸载。(4.0和4.2.2都是jdk1.6)
4.安装必要的库。这部分可以参考网上的其他博客,大部分库都给出了,我当时装的库如下:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev g++-multilib
mingw32 tofrodos python-markdown libxml2-utils xsltproc gcc-multilib lib32readline-gplv2-dev
这些库也是参考的其他人的博客,编译时发现这些是不全的,不过不用担心,后面需要的时候再装就是了~
5. 初始化参数和变量: cd到你的源码目录,然后
$ source build/envsetup.sh
6. lunch 然后选1
7. make
8.然后就是“出现问题-查问题-解决问题”的环节,感谢万能的度娘和Google,我遇到的问题如下(当然还有些我没遇到你可能遇到的,请自行查询了):
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
FIX1: vi frameworks/base/tools/aapt/Android.mk
Add '-fpermissive' to line 31:
LOCAL_CFLAGS += -Wno-format-y2k -fpermissive
Fix2: sudo apt-get install zlib1g-dev sudo apt-get install lib64z1-dev or sudo apt-get install lib32z1-dev
Error:
程序“javac”已包含在下列软件包中:(java,jar is as same)
Fix: sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/SunJDK/jdk1.6.0_22/bin/javac 300
Error:
make: *** No rule to make target `run-java-tool', needed by `out/target/common/docs/doc-comment-check-timestamp'. Stop.
Fix:
etc/profile : export ANDROID_JAVA_HOME=$JAVA_HOME
source /etc/profile
Error:
make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb]
Fix: sudo apt-get install lib32ncurses5-dev or sudo aplt-get install libncurses5-dev
Error:
latform_types.h:12:22: 致命错误: X11/Xlib.h:没有那个文件或目录
编译中断。
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_renderer_intermediates/main.o] 错误 1
Fix:
sudo apt-get install libx11-dev or sudo apt-get install x11-dev
Error:
/usr/bin/ld: cannot find -lX11
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/lib/libOpenglRender.so] Error 1
Fix:
sudo apt-get installibgl1-mesa-glx:i386
sudo apt-get install libx11-dev:i386
Error:
development/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp:22:20: fatal error: GL/glx.h: No such file or directory
compilation terminated.
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libGLcommon_intermediates/GLDispatch.o] Error 1
Fix:
sudo apt-get install libgl1-mesa-dev
Error:
make: *** [out/host/linux-x86/obj/lib/libGLES_CM_translator.so] Error 1
Fix:
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 /usr/lib/libGL.so
(在网上搜到上面的解决方法,可是按照上述方法做了,问题依旧。经过多方实验,才发现问题所在。通过apt-get install的库不是libGL.so.1.2了。而是libGL.so.1.2.0.
所以大家在创建链接的时候最好去/usr/lib/i386-linux-gnu/mesa/这个目录下看看libGL的库版本,不要完全按照网上的照抄。现在网上的都是“sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 /usr/lib/libGL.so ”而我的是sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.0 /usr/lib/libGL.so 。可能库最近升级了。)
9. 解决make遇到的问题后,什么样子代表成功编译了呢?如下
10. 启动Emulator
想启动Emulator,是要配置下环境变量的:
/etc/profile:
export ANDROID_JAVA_HOME=$JAVA_HOME
export PATH=/home/yagami/android/out/host/linux-x86/bin:$PATH
export ANDROID_PRODUCT_OUT=/home/yagami/android/out/target/product/generic
export ANDROID_BUILD_TOP=/home/yagami/android
启动后如下:
ok,小伙伴就此可以愉快的读源码,改源码了~
4.0过程和这个相似,遇到问题要尽快网上查,大部分都是缺某个库,文件链接等问题,万能的互联网都有的~
参考链接:
http://www.cnblogs.com/qianxudetianxia/p/3681890.html
http://blog.csdn.net/oldmtn/article/details/9189509