终于成功把Android 6.0 r1源码的源码编译。先上图,这是在Ubuntu中运行的Android模拟器:python
因为我是在Win8中安装虚拟机VMware,而后在虚拟机中安装Ubuntu进行编译,因此遇到诸多麻烦。若是直接在Linux中编译,可能会更顺利。linux
--------------------------------------------------------------------------------------------------------------------------android
准备工做:git
VMware虚拟机,安装请参考:VMware8安装配置Win七、CentOS-7向导 http://www.linuxidc.com/Linux/2016-01/127188.htmgithub
官网下载Ubuntu镜像:ubuntu-14.04.3-desktop-amd64.isoshell
安装ubuntu,一并参考“VMware8安装配置Win七、CentOS-7向导”ubuntu
-----------------------------------------------------------------------------windows
建议:ubuntu内存分配4G,预留90G虚拟硬盘(以前选择了默认的20G,在解压tgz的时候直接报空间不足),网络选择“Bridged”方式。缓存
为了编译Android源码,下面对安装好的ubuntu做一些配置工做。
首先调出终端,用如下快捷键
Ctrl + Alt + T
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev libsdl-dev libesd0-dev
上面红色部分是数字“1”。固然,你也能够分开执行这些安装命令。
若是没有这些依赖组件,可能会遇到相似这样的错误:
首先用如下命令搜索JDK版本
apt-cache search openjdk
执行安装
sudo apt-get install openjdk-7-jdk
查看是否安装成功
java -version
直接运行
echo $JAVA_HOME
并不能看到输出。
设置:
echo export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" >> ~/.bashrc
而后重启terminal或经过使用如下命令
source ~/.bashrc
此时从新输入$JAVA_HOME,就能够看到配置好的路径了
这个有什么用呢?利用Xshell方便咱们在windows和虚拟机中操做文件。Ubuntu缺省下是没有安装SSH Server,Client却是为咱们装好了。
不知道怎么用Xshell的,请看
Xshell 登陆 CentOS 6.3 中文乱码的解决 http://www.linuxidc.com/Linux/2013-06/86600.htm
VirtualBox4.12文本安装CentOS 5.4以及Xshell链接教程 PDF http://www.linuxidc.com/Linux/2013-06/85575.htm
Xshell链接CentOS6.5 iptables或ls 输出乱码 http://www.linuxidc.com/Linux/2014-06/103725.htm
VMware Linux使用Xshell登录 http://www.linuxidc.com/Linux/2012-06/62546.htm
使用Xshell密钥认证机制远程登陆Linux http://www.linuxidc.com/Linux/2015-03/114947.htm
sudo apt-get install openssh-server
重启它
sudo /etc/init.d/ssh restart
在百度云盘上共享了Android6_r1的源码,请下载:Android 6.0 r1分卷源码 http://www.linuxidc.com/Linux/2016-01/127285.htm
此办法笨了点。利用Xshell其实挺快的。直接拖进来。
监测文件Hash,看是否有损坏。具体对应什么字符串请对照hash.txt
md5sum Android6_r1_aa
而后把这几个文件合并成一个
cat Android6_r1_* > M.tgz
计算合并后的文件哈希
md5sum M.tgz
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2016-01/127292p2.htm
tar zxvf M.tgz
这是个漫长的过程。
这个解压命令会建立mydroid文件夹,解压的东东都在里面
在 .bashrc文件中添加:export USE_CCACHE = 1,操做以下:
echo export USE_CCACE=1 >> ~/.bashrc
为了提升编译效率,设置编译器高速缓存。执行如下命令:
prebuilts/misc/linux-x86/ccache/ccache -M 30G
-M 30G 两个参数表示设置30G大小的空间做为缓存,这个数值能够根据本身的硬盘空间大小继续调整
接着导入编译Android源码所需的环境变量和其它参数,运行如下命令
source build/envsetup.sh
运行lunch命令选择编译目标
lunch
好比选择1,会出现如下提示信息,告诉咱们编译的源码的一些相关信息
make -j8
由于笔记本是i5 4210u,因此使用8(CPU核心的两倍),此处可能设置过大了。
看来并非一路顺风啊,出问题了。开始我还觉得JDK版本不对,进入build/core/main.mk
发现默认就是1.7。
错误中止在下面的地方:
上面提过了,一开始我也没安装这些依赖组件,致使了一些没必要要的麻烦。
还有其它常见编译错误,已经有人整理出来了,适合的就参考如下吧:
一、编译Android源码致命错误解决方案 http://www.linuxidc.com/Linux/2016-01/127187.htm
二、编译Android系统源码和内核源码 http://www.linuxidc.com/Linux/2016-01/127291.htm
继续编译
make -k
用了make -k以后,就悲剧了,编译了一个晚上还没好。
早上起来的时候果断用“Ctrl + C”中断编译,从新安装以上的依赖包,接着作清理工做
make clean
而后继续开始,多加个sudo,由于以前的编译输出了“没有权限操做”相似的提示。
sudo make -j8
大约两个小时后,硬盘利用率100%,一直没动。编译也彷佛停住了。一个小时后,貌似挂了T~T
难道高速缓存占用太多硬盘空间?虚拟机给的空间不够?
好吧,我从新装一个Ubuntu。而后分配60G的虚拟空间,2G内存,20G编译高速缓存。又跑一个晚上。
次日一看,又是error,真是泪流满面!
arm-linux-androideabi-g++: Internal compiler error: Killed (program cc1plus)
这是什么鬼?
经过命令build-essential,g++我也装了呀。
google了一下,有一个bug report:Build #478 Failed,但是没看到解答。
看到stackoverflow上一个相似问答:arm-linux-androideabi-gcc: Internal error: Killed (program cc1) from Android NDK r8
整理几个答案:
This error went away for me when I used "make" instead of the recommended "make -j4".
But rebooting the virtual machine seems to fix the problem for me. // are you sure??
For those having this issue with VMs, the solution that worked for me was bumping up the base memory. It was originally set to 512MB to 1536MB.
但是这是gcc呀。
而后又找到这个:firefox build for Android fails,里面提到:
well the problem was caused by too little RAM allocated to my VM. Upped the RAM from 1Gb to 4Gb and the compile is now proceeding nicely.
真是RAM小了?
再试试吧。因为机器配置缘由,最多好像只能给虚拟机分配3G的内存。而后直接sudo make执行命令。
抓狂啊!!难道ARM还小了?
重装ubuntu再来。此次分配90G硬盘空间,4G内存(开始我还觉得只能给3G)。
最终使用如下编译命令
sudo make -j2
从上午11点半左右开始执行,晚上10点回来,看到竟然编译成功了!看到system.img没有?哈哈~
进入目录/out/target/product/generic,能够看到ramdisk.img, system.img, userdata.img, cache.img这四个镜像文件
因为刚刚编译成功,若是此时还没有退出终端的话,能够直接启用命令运行Android模拟器。
emulator
若是退出了先前编译的终端命令行窗口,那么运行模拟器就彻底不同了。
若是对你有用,请支持一下~
参考:
在Ubuntu上下载、编译和安装Android最新源代码 http://www.linuxidc.com/Linux/2011-06/37781.htm
Android 4.4源码编译 http://www.linuxidc.com/Linux/2015-01/112628.htm
更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2
更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11