一直想把Android源码编译一下,最近工作不太忙,就抽出时间编译了一下,现在整理一下:
第一步下载:
由于Android源码比较大,而且现在google网站也不稳定,为了不耽误时间,我直接从百度网盘上下载了一个,Android4.3源码百度网盘,大概23g,还是很大的。
由于我是在Vmware里面装的ubuntu,然后需要把源码拷贝到里面,解压里面的压缩文件。
如果有VPN的话,可以自己参考老罗或者google一下repo下载的方法,这里我就不介绍了。
第二步准备编译:
由于是拷贝过来的源码,首先就是sh脚本权限问题,我比较懒,懒得一个一个找,就直接把整个目录都赋予了777权限。
进入源码目录
chmod 777 * -R
-R参数是递归 处理目录下的所有文件以及子文件夹
777是变更后的权限表示
还有一个问题就是从别人那边copy 解压后的软件包的!
在目录external\iptables\extensions中存在 不少文件名一样,只是大小写不一样的情况,比如libipt_ecn.c和libipt_ECN.c,将源码包中的文件与你当前编译包中的文件作对比,恢复为源码包中的文件就可以继续编译了。由于linux下的文件名命名规则与windows下的不同引起的.
在目录external\iptables\extensions和external/iptables/include/linux/netfilter下面对照着下面的在线源码更改一下:http://androidxref.com/4.3_r2.1/xref/external/iptables/extensions/
http://androidxref.com/4.3_r2.1/xref/external/iptables/include/linux/netfilter/
external\iptables这个目录下面的其他目录下面也有,也要对比一下,我当时是改了好几次的,为了方便
大家使用,我把这个iptables目录打包了一下,刚好文件也不大,上传到百度网盘:
切记,一定要在linux系统下面解压替换这个问题,否则又会出现少文件的问题。
由于编译需要不少的工具,下面就直接安装一下:
sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
第三步编译:
初始化编译环境
切换到Android源码目录:
$ cd WORKING_DIRECTORY
执行下面命令,加载编译过程中用到的命令、环境变量:
$ source build/envsetup.sh
Ø 选择编译选项
执行下面的命令,从列表中选择一个编译项:
$ lunch
这些都是编译厂商版本,具体可以查一下android文档,测试用一般直接回车就行了,官网说明:
然后
输入下面命令开始编译:
$ make -jn
其中,-jn表示,n个线程同时编译,一般n的值为CPU核的2倍,但是,也要和你的Ubuntu的内存有关系,每个线程在编译时最少需要1G内存,如果你没有很多内存,还是直接使用make命令吧,否则,编译到后面会出错。
我用的是make -j4编译的(我电脑是4核i7的)
这个过程,如果是虚拟机的话,大概要2个多小时,如果是实体机的话,要看配置,一般在1个小时以上。
下面附上一张我编译成功的图片:
下面是一些常用的编译命令:
source build/envsetup.sh:加载编译命令,产生编译选项
lunch或lunch xxx-yyy:打印编译选项菜单或指定编译选项,xxx表示产品,yyy表示编译类型
make:根据lunch选项,编译Android系统,最后产出为:system.img,ramdisk.img,userdate.img
m:和make命令一样
mm:从当前目录下开始向下编译目标
mmm:指定一个目录,仅编译指定目录下的目标
make snod:只将out/target/product/XXX/system/目录下的内容打包生成system.img,不会检查依赖关系
make bootimage:只将out/target/product/XXX/root/目录下的内容打包生成ramdisk.img
最后简单罗列一些容易出现的问题,不过只要第二步编译前的准备做好了,这些就不会出现了,这些基本都是我遇到的,哈哈。
/home/xuwt/android-sdks/platform-tools/aapt:
error while loading shared libraries: libz.so.1: cannot open shared object file:
No such file or directory
其实这个问题就是你64位的操作系统没有32位的类库,而android的SDK是要32位支持的
,如果没装就只能是报上面的错!
打开终端运行下面的命令:
sudo apt-get update
sudo apt-get install ia32-libs
运行第二个命令时有可能会说找不到或者被其它的所替代,然后再把终端列出的安装就好了.
Yacc: aidl <= frameworks/base/tools/aidl/aidl_language_y.y
prebuilts/misc/linux-x86/bison/bison -d -o out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp frameworks/base/tools/aidl/aidl_language_y.y
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] 断开的管道
sudo apt-get install bison
/usr/bin/ld: cannot find -lz
host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1
解决方法: sudo apt-get install zlib1g-dev sudo apt-get install lib64z1-dev
/bin/bash: bison: command not found
Yacc: aidl <= frameworks/base/tools/aidl/aidl_language_y.y
bison -d -o out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp frameworks/base/tools/aidl/aidl_language_y.y
/bin/bash: bison: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] Error 127
解决方法:sudo apt-get install bison
/bin/bash: flex: command not found
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp: In function ‘int yyparse()’:
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1827: warning: deprecated conversion from string constant to ‘char*’
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1970: warning: deprecated conversion from string constant to ‘char*’
Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l
/bin/bash: flex: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127
解决方法: sudo apt-get install flex
/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
fatal error: GL/glx.h: No such file or directory
development/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp:22: 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
解决方法:sudo apt-get install libgl1-mesa-dev
sh: gperf: not found
target Generated: libwebcore <= external/webkit/Source/JavaScriptCore/create_regex_tables
Generating CSSPropertyNames.h <= CSSPropertyNames.in
sh: gperf: not found
calling gperf failed: 32512 at ./makeprop.pl line 140.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/css/CSSPropertyNames.h] Error 25
make: *** Deleting file `out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/css/CSSPropertyNames.h'
解决方法:sudo apt-get install gperf
参考:
http://blog.csdn.net/xwwxxw123321/article/details/12321695