一.环境搭建
因为android的源码编译只支持linux和mac,所以无法在windows下编译.我的电脑也没有双系统,因此只有装一个虚拟机。我用的是VMware workstation 我放到了百度云https://pan.baidu.com/s/1jHSrB2A。下载好安装虚拟机时最好多分配点硬盘空间,尽量30G以上,运行内存也分配2G以上。配置好虚拟机以后就要下个系统,推荐是用ubuntu系统,这个直接百度搜一下就有了。
二、配置ubuntu系统环境
1.下载java jdk,因为我编译的android2.3.1的源码,所以只能下载 1.6的jdk。下载jdk和配置方法参考http://www.cnblogs.com/a2211009/p/4265225.html ,如果要下载1.6的将里面的7改成6就可以。
2.编译需要的依赖包下载,参考http://blog.csdn.net/banketree/article/details/9089827
三、下载android源码
我一开始想用官方的下载方法,奈何没有vpn一直连接不上,最后不得不从其他地方下载。
1.可以从github上下载http://www.it165.net/pro/html/201409/22577.html#viewSource但是下载下来的源码没有makfile文件无法编译。
2.从网盘下载我提供我的网盘下载链接,不过源码是2.3.1的,如果需要新版的就得自己去找了。https://pan.baidu.com/s/1slxl0ML
四、开始编译
做了好准备工作就开始编译源码,编译源码说难也不难,说简单也不简单。其实编译的命令非常简单只要通过终端进入到你存放源码的目录 执行make命令就开始编译了。难就难在编译的过程中有很多的问题需要解决。下面我就列出 我编译时遇到的问题。
- //如果有权限呗拒绝就调用下面的语句修改权限
在源码目录下 直接chmod -R 777 * - make: * [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1
解决:
vi frameworks/base/tools/aapt/Android.mk
在第31行增加:
LOCAL_CFLAGS += -Wno-format-y2k -fpermissive - make: * [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/AssetManager.o] Error 1
解决:
vi frameworks/base/libs/utils/Android.mk
在第60行后面增加-fpermissive:
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive - make: * [out/target/common/obj/all-event-log-tags.txt] Error 126
修改这个权限就好了build/tools/merge-event-log-tags.py - make: * [out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/content/EventLogTags.java] Error 126
修改这个权限就好了build/tools/java-event-log-tags.py: Permission denied make: * [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] 错误 1
或者 make: * [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] Error 1
解决办法:cd external/srec
复制拷贝下面的命令到终端:
wget “https://github.com/CyanogenMod/android_external_srec/commit/4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff”
patch -p1 < 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
rm -f 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
cd ../..make: * [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] 错误 1
.make: * 正在等待未完成的任务….
.true
root@mc-virtual-machine:~/android/bin/android_source#
解决方法:这就说明系统里有部分必须的软件未安装,通过apt-get install 安装即可。其中,zlib工具包名不是zlib,而是zlib1g-dev,即:
sudo apt-get install zlib1g-dev
可以完成安装。- make: * [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] 错误 1
make: * 正在等待未完成的任务….
true
root@mc-virtual-machine:~/android/bin/android_source
解决方法:安装libncurses5-dev:i386则可以搞定~~ 如下:
apt-get install libncurses5-dev:i386
- make: * [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] 错误 127
127的一般都是缺少库 这里下载 sudo apt-get install build-essential - [out/host/linux-x86/obj/STATIC_LIBRARIES/libext4_utils_intermediates/output_file.o] Error 1
/usr/include/zlib.h:34: fatal error: zconf.h: No such file or directory
compilation terminated.
make: * [out/host/linux-x86/obj/STATIC_LIBRARIES/libext4_utils_intermediates/output_file.o] Error 1
make: * Waiting for unfinished jobs….
由于系统的文件换了位置, 此时需要将 /usr/include/x86_64-linux-gnu/zconf.h 拷贝到上级目录,此时编译才通过
将 zconf.h 拷贝到 /usr/include/ 目录即可
cp /usr/include/x86_64-linux-gnu/zconf.h /usr/include/ make: * [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1
此处编译错误是由于ubuntu 11.10采用了GCC4.6.1导致的。
解决方法:
修改源码目录下/build/core/combo/HOST_linux-x86.mk文件:
将以下语句
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改为
[html] view plain copyHOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
make: * [out/target/product/generic/obj/EXECUTABLES/BufferQueue_test_intermediates/BufferQueue_test.o] Error 1
解决:
其实是读取错文件了,你把正确文件拷贝过去就ok了
cp system/media/opensles/libopensles/OpenSLESUT.h system/media/opensles/include/SLES/OpenSLESUT.h
上面就是我在编译过程中遇到的问题,从开始编译靠结束用差不多5个小时,如果有遇到上面没有的问题直接不google找,尽量别去百度,浪费时间又找不到,google一搜一个准。
五、启动模拟器
到这一步就很简单了,首先配置一下环境 USER-NAME@MACHINE-NAME:~/Android exportPATH= PATH:~/Android/out/host/linux-x86/bin
USER-NAME@MACHINE-NAME:~/Android exportANDROIDPRODUCTOUT= /Android/out/target/product/generic其中, /Android/out/host/linux−x86/bin有我们要执行的emulator命令,而 /Android/out/target/product/generic是Android镜像存放目录,下面执行emulator命令时会用到。运行模拟器USER−NAME@MACHINE−NAME: /Android emulator
如果出现SDL init failure, reason is: No available video device
就安装sudo apt-get install libsdl1.2debian:i386。然后在运行就可以了