您的位置:首页 > 移动开发 > Android开发

使用Vmware虚拟Ubuntu 16.04 LTS 成功编译 Android 6.0 源码

2017-11-17 21:09 393 查看

1、引言

经过3天半的奋战,本人终于在VMware虚拟的Ubuntu 16.04 LTS 上成功编译出了Android 6.0源码。期间走了很多弯路,也爬过了很多坑,中间想过放弃,但最终还是咬牙坚持了下来,现总结出来,有需要的伙伴可以用来参考,以后少走弯路。

开始编译前,我本机刚好有一个VMware虚拟的Ubuntu 16.04 LTS系统,因此决定在其上面来进行干活。于是找到了Google官方网站源码编译指南—https://source.android.com/source/initializing

如下图所示,



注意需要翻墙。

从图中可以看到,里面详细介绍了源码如何下载源码,如何进行编译等。

这里写的比较官方和正式,但是我从其他各种渠道了解到,光从这里得到的信息进行编译还是不够的,因为它没有指出各版本源码在编译过程中的注意事项,就是所谓的坑。于是在将这些官方文档逐个浏览了一遍后,开始到网上找一些踩过坑的实战文章。经过筛选,还真找到一篇和自己编译环境 相仿的文章–http://blog.csdn.net/fuchaosz/article/details/51487585,其中介绍了各种采坑过程,源码下载地址,注意事项等,我能编译成功,多半也是这篇文章帮的忙,所以在这里对这篇文章的作者表示感谢。

2、编译准备

(1)、编译系统–VMware WorkStation Pro 12虚拟的Ubuntu 16.04 LTS

源码–Android 6.0 r1

JDK–Open JDK 7

(2)、搭建编译系统

我本机是Win7,然后安装了一个VMware WorkStation Pro 12,虚拟的Ubuntu 16.04 LTS的版本。具体怎样安装以及虚拟系统,这里不做过多多叙述了,大家可以百度,有很多资料可以参考。

有的博客建议直接将Ubuntu 系统装到电脑上,而不是虚拟机上,这样编译速度快一些。这个可以视个人情况而定,如果硬件足够好,cpu内核多,内存也足够大,在虚拟机上编译也不是问题。本人电脑是公司的,装的是win7,客观情况不允许直接替换成ubuntu,所以只能虚拟一个。我的电脑的硬件配置是Inter i5,4核,8G内存,我算了一下如果编译过程中排除查错,重编的耗时,整个编译过程应该在5个小时左右,我感觉还是可以接受的。

这里有个主意事项是,虚拟Ubuntu 系统时,留给系统的磁盘一样要足够大,不要选择默认的20G,这点空间连存放源码的解压缩后的文件都不够,根本无法再编译,本人开始就吃了这个亏,后来重新又虚拟的系统,建议留120G左右。

(3)、下载Android 6.0源码

我们可以到官方网站去下载,但往往很难成功,而且需要翻墙,速度也比较慢,可以到下面地址去下载Android 6.0源码.

Androdi 6.0源码下载地址: http://pan.baidu.com/s/1o6N86a2

感谢下面这位博主上传源码,我也是从他的博客下载的源码:

http://blog.csdn.net/ilittleone/article/details/6823441

注意:下载的源码存放路径不能有中文,否则编译时会报错,还有存放的路径不建议太深,最好在盘符的根目录。

(4)、解压源码,合并文件

下载完毕后,在系统的终端使用下面命令合并:

cat Android6_r1_*>Android6_r1.tgz

合并完后,使用下面命令可以校验hash,判断文件有没有损坏:

md5sum Android6_r1.tgz

将显示的字符串结果和下载的文件里面的hash.txt中的内容作比较,如果相等,说明没有损坏,反之,需要重新下载。一般都不会有问题。

压缩包大概有6.6GB



(5)、解压缩源码

使用如下命令解码,

tar -zxvf Android6_r1.tgz
解压时间会很长,解压完成后最后几行显示这样的结果,

mydroid/prebuilts/qemu-kernel/arm/2.6/kernel-qemu
mydroid/prebuilts/qemu-kernel/arm/2.6/vmlinux-qemu
mydroid/prebuilts/qemu-kernel/arm/vmlinux-qemu


解压的所有文件我看了一下属性,大概有13个G多一些。

(6)、安装依赖包。

这个主要参考了http://blog.csdn.net/fuchaosz/article/details/51487585的博客。

如下所示,

sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4


本人没有更改软件源,因为发现这样直接下载速度还是很快的,所以就没有必要修改软件源。Ubuntu 16.04请务必使用上面的依赖,Ubuntu 16.04需要的依赖和Ubuntu 14.04所需要的依赖是不同的,不然会踩到很多的坑,具体什么样的坑本人倒是没有踩到,只是看到很多博客都这样说。

(7)、安装JDK

从Android 6.0开始Android源码的编译需要安装OpenJDK,不能使用Oracle JDK,而且Android 6.0只能使用OpenJDK7,这个官网的文档描述的有点模糊,如下图所示,



官方建议使用openjdk-8-jdk,但是对于 Android 6.0使用OpenJDK7就可以了。

由于Ubuntu 16.04没有OpenJDK7的源,因此在16.04上安装OpenJDK7需要执行下面的命令:

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk


然后打开/etc/profile文件,进行环境变量的配置:

sudo gedit /etc/profile


然后可以使用如下命令检查Java版本是否正确安装,

java -version


如果结果正确,如下所示,



(8)、修改已知的坑

修改 mydroid/art/build/Android.common_build.mk 文件,定位到75行,将下面的代码:

ifneq ($(WITHOUT_HOST_CLANG),true)


改为:

ifeq ($(WITHOUT_HOST_CLANG),false)


据说,如果不修改这里,会遇到一个比较棘手的编译错误,修改的目的是把CLANG这个编译选项关掉,如果不修改遇到错误,百度搜狗都无解,这个错误只会在Ubuntu16.04上遇到,Ubuntu14.04则不存在这个问题。

3、编译

编译之前,需要做一些设置工作,如下所示,

(1)、在 .bashrc文件末尾添加:export USE_CCACHE = 1

在终端运行如下命令,

echo export USE_CCACHE=1 >> ~/.bashrc


(2)、 为了提高编译效率,设置编译器高速缓存为50G

在终端输入如下命令,

prebuilts/misc/linux-x86/ccache/ccache -M 50G


(3)、然后导入编译Android源码所需的环境变量和其它参数

source build/envsetup.sh




(4)、运行lunch命令选择编译目标

lunch




选择1:



(5)、开始编译

执行

make -j8


8为同时编译的线程数,google推荐这个数字为2倍的cpu个数再加上2,比如4核,就是10。

这里需要注意,这里的cpu个数要根据虚拟机中设置的cpu个数相符,我设置成了4核,所以可以使用-j8或者-j10,如果只有两个cpu使用,可以使用-j4或者-j6。

如下所示,



我使用的是

make -j8
然后正式开始编译。因为我参考了很多博客,所以,踩得坑要相对少一些。

4、编译排错

首先说一下我没有遇到过的坑

(1)、中文目录问题

因为已经了解,不止一人在说编译路径不能有中文,所以这个问题从解压缩源码时就避免了。快检查一下吧,如果当前编译路径带有中文字符,尽快停止重新编译。

(2)、JDK的问题

在Android6.0上 编译源码不能再使用Oracle JDK了,需要切换到Open JDK。所以这个坑也避免跳进去了。

(3)、编译过程报错的问题也通过

修改文件mydroid/art/build/Android.common_build.mk,



ifneq ($(WITHOUT_HOST_CLANG),true)


改为:

ifeq ($(WITHOUT_HOST_CLANG),false)


提前避免了。

以上是已知的坑,下面说一下自己遇到的坑,

(1)、源码压缩包解压遇到的问题

将源码下载拼接后,为了节省空间,所以把压缩包放到了windows和ubuntu的共享区域,接着在ubuntu中使用

tar -zxvf Android6_r1.tgz


命令进行解压,结果报了一堆错误,解压停止,

报错如下所示:



经过查资料,参考

http://blog.sina.com.cn/s/blog_68eb8fa50102vfab.html,原文这样说的,

“在用Vmware装Linux进行嵌入式开发的过程中,为了方便linux与windows进行快速的文件共享,常常会安装vmware工具进行文件夹共享。但这会造成linux下连接特别是符号连接的问题,上面问题的原因就在于此,最好的解决方式就是讲.tgz压缩包拷贝到linux的文件系统中,然后解压。”

于是将共享区域的压缩包拷贝出来放到了ubuntu独有的目录中进行解压。

(2)、空间不足的问题

在解压快完成时,突然报错了,提示系统空间不足,后来一看,原来自己的系统只有20G,这下郁闷了。没办法,接着想办法进行解决,想到两个方法,一是扩容,二是重新虚拟一个系统。为了省事,我选择了前者,而选择前者又刚好相反,走了弯路。

对原有系统进行了扩充到120G,主要参考如下两个链接:

http://blog.csdn.net/ygm_linux/article/details/19157781

http://blog.csdn.net/q1302182594/article/details/51658229

然后从头开始重新编译,编译3个小时候,又报控件不足了,这次是主分区sda1空间不足,而我编译是在新扩充的sda4上编译的啊,为什么sda1会空间不足,于是开始查各种资料,因为这种问题也不太好提炼关键字进行搜索,到最后也没有找到好的解决方案。于是在经过2,3个小时的排查后,果断放弃,决定重新虚拟一个大空间的系统。

5、编译成功

重新搭建了一个ubuntu系统,这次将系统空间直接预留了120G,按照以上步骤重新搭建了编译环境,接着将源码从共享空间拷贝到/home目录,然后解压缩,在mydroid目录下继续编译。经过一晚上(4小时左右,公司规定下班需要关闭电脑),第二天接着1个多小时的编译,最后终于编译成功。

看到如下界面,真的是小激动了一下,



6、模拟器运行

为了验证编译结果是否正确,决定跑一下模拟器。

直接在命令框中输入emulator是无法启动模拟器的,于是查询资料,主要参考了

http://blog.csdn.net/pcsxk/article/details/52016739

所说的方式,

首先确保开启了硬件虚拟化,使用指令,

egrep -c '(vmx|svm)' /proc/cpuinfo


执行的结果不为0表示开启成功。

然后重新配置一下环境变量,

source build/envsetup.sh


最后输入,

lunch


执行后依然选择我们编译时候选择的build target,这样emulator就可以启动起来。

7、总结

Android系统源码的编译就是不断和各种“坑”打交道,不断掉坑,然后从坑爬出来,继续掉坑,爬坑的过程。而如果提前获取到足够多的坑信息,那就可以避免不必要的爬坑,从而节省我们的时间,愿本文能够让你少掉坑,少爬坑,一步到位,编译成功!



欢迎您扫一扫上面的微信公众号,订阅我的个人公众号!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 源码编译