ubuntu16.04lts成功编译android6.0源码教程(转)

author author     2022-08-02     316

关键词:

1 前言

经过3天奋战,终于在Ubuntu 16.04上把Android 6.0的源码编译出来了,各种配置,各种error,各种爬坑,特写此博客记录爬坑经历。先上图,Ubuntu上编译完后成功运行模拟器,如图:

技术分享

2 编译环境

  • UbuntuKylin 16.04 LTS
  • Android 6.0_r1
  • Open JDK 7

3 准备工作

(1) 下载Android 6.0源码.

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

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

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

下载源码请在Windows下面下载,迅雷不解释。 
注意:源码的存放路径不能有中文,否则编译到系统内置的apk的时候会报错无法解析class.dex文件

(2) 解压源码,合并文件。 
下载完毕后,使用下面命令合并:

cat Android6_r1_*>Android6_r1.tgz

合并完后,使用下面命令校验hash:

md5sum Android6_r1.tgz

此时会生成一个hash串,如图:

技术分享

对比你下载的文件里面的hash.txt,如果一致那么继续,不一致则文件损坏,重新下载。

(3) 解压源码。

tar -zxvf Android6_r1.tgz

解压源码是个漫长的过程,解压后会在当前目录下生成一个mydroid的文件夹。如果你发现源码的路径有中文,需要移动源码,请复制压缩包,然后再使用命令解压,而不要直接复制解压后的文件夹

(4) 安装Ubuntu 16.04 
编译Android源码最好直接安装Linux,不要使用虚拟机,编译源码是个漫长的过程,虚拟机要十几个小时,博主直接在电脑上装Ubuntu,编译只需要3个小时。实体机可避免虚拟机的很多问题,例如:磁盘空间不足,内存不够等等。更重要的是,编译源码是个不断爬坑的过程,实体机可以很快的遇到错误,然后解决问题,继续编译,再次遇到错误,而虚拟机这个周期会很漫长,因而浪费大量时间。实体机解压速度也比虚拟机快得多。Ubuntu与windows兼容做的很好,可以直接把Ubuntu当作一个windows程序安装,也可以单独安装,如果单独安装请务必给/home分区分配至少120G空间,因为编译后的Android系统真的很大。 
强烈建议下载Ubuntu镜像,然后使用软碟通刻录到U盘,通过U盘把Ubuntu安装到物理机器上。

(5) Ubuntu安装教程参考下面链接,Ubuntu 16.04安装方法也是一样的 :

http://jingyan.baidu.com/article/59703552e0a6e18fc007409f.html

(6) 再次声明:转载请注明来自”梧桐那时雨”的博客:http://blog.csdn.net/fuchaosz/article/details/51487585

4 安装依赖

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所需要的依赖是不同的,博主照着Ubuntu 14.04的依赖结果掉进大坑,详见后面的编译过程记录.

5 安装open JDK7

从Android 6.0开始Android源码的编译需要安装OpenJDK,不能使用Oracle 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 


配置OpenJDK.打开/etc/profile文件:
sudo gedit /etc/profile

在末尾追加下面代码:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
export PATH=${JAVA_HOME}/bin:$PATH

 

修改了/etc/profile文件需要重启才能生效,但使用下面命令可以在不重启的情况下在当前bash环境生效:

source /etc/profile

检查OpenJDK配置是否正确:

java -version

配置正确则如下图:

技术分享

6 修改源码

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

ifneq ($(WITHOUT_HOST_CLANG),true)

改为:

ifeq ($(WITHOUT_HOST_CLANG),false)

如果不修改这里,会遇到一个比较棘手的编译错误,修改的目的是把CLANG这个编译选项关掉,详见后面的编译记录,百度搜狗都无解,这个错误只会在Ubuntu16.04上遇到,Ubuntu14.04则不存在这个问题,解决这个编译错误花费一天时间,还好咱英语好,在歪果人的论坛上看了几篇帖子,终于搞定了。这里顺便说一下小技巧: 
遇到编译错误,请把error后面的错误信息全部复制,然后用搜狗搜英文网页,不要用百度那个渣渣

7 开始编译

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

echo export USE_CCACHE=1 >> ~/.bashrc

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

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。博主使用的是8:

make -j8

关于cpu个数,可以用下面命令查看:

cat  /proc/cpuinfo

好了,开始编译了,接下来就是不断error,不断修复,继续编译的过程,下面记录我的爬坑经历

7 编译记录

我是参照下面这篇文章开始编译的:

http://www.linuxidc.com/Linux/2016-01/127292p2.htm

如果一帆风顺,我也就用不着写这篇博客了,然而他用的是Ubuntu14.04,我用的最新的Ubuntu16.04,按照上面这篇博文,遇到很多坑,这里记录以下爬坑经历: 
(1) 依赖不同。Ubuntu 14和16的依赖选项是不同的: 
技术分享

于是将libsdl1.2-dev改为libsdl-dev,将mingw32去掉

(2) JDK配置错误。 
先用Oracle JDK8报下面错: 
技术分享

改为Oracle JDK7报下面错: 
技术分享
后改为OpenJDK7解决问题。

(3) 大坑。接着遇到下面错误: 
技术分享

仔细看错误:

clang: error: linker command failed with exit code

其实这个是系统使用clang编辑器报的错,百度了一下,解决方法一般是将art/build/Android.common_build.mk文件ifneq ($(WITHOUT_HOST_CLANG),true)改为ifeq ($(WITHOUT_HOST_CLANG),false) 
然而纸上得来终觉浅,绝知此事要躬行,因为,这并没有什么卵用,至少现在没有卵用。不信,请看下面的帖子:

http://ask.csdn.net/questions/253318

我试了一下,也没用,还是没解决问题,好像这个是新系统的兼容问题,百度搜狗一天,没有进展,后来发现了下面这篇帖子,也是14.04编译Android6.0的:

http://blog.csdn.net/lewif/article/details/49762993

抱着反正无聊试一试的想法,把上面这篇帖子中的依赖一通复制(所以最终用的依赖是两篇帖子加起来的依赖):

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4

然后make clean,重新再来,接着就睡觉去了。 
一觉醒来,然后……..你以为我就编粗来了?呵呵,这个错误是终于编过去了,可是又遇到下面的错误: 
技术分享

解决这个错误,又花费一番力气,在歪果人的论坛上看到下面这篇帖子:

http://forum.xda-developers.com/chef-central/android/guide-how-to-setup-ubuntu-16-04-lts-t3363669/page2

注意看这个帖子的15楼,哈哈,这个时候找到解决方法了,再修改art / build/Android.common_build.mk文件

 ifneq ($(WITHOUT_HOST_CLANG),true)

改为:

ifeq ($(WITHOUT_HOST_CLANG),false)

重新编译,解决问题。

(4) 中文路径,坑。 
技术分享

遇到这个问题也是很难百度到,哎,最后把源码换到了全英文的路径下面,解决这个问题。注意移动源码的时候不要直接复制mydroid文件夹,一个小时都复制不完,所以正确的方法是复制压缩包,然后再解压一遍。 
接下来就编译成功了。

8 编译成功

编译成功后如下图: 
技术分享

进入mydroid/out/target/product/generic目录,可以看到编译好的文件: 
技术分享

启动模拟器:

emulator

稍等一会,就可以出现开头的模拟器画面了,哈哈,打完收工。

9 附录:Ubuntu 16.04编译ROM英文教程

最后,附上在看帖子的时候发现的,在Ubuntu16.04上编译AOSP、CyanogenMod的教程,当然是英文的啦:

http://forum.xda-developers.com/chef-central/android/guide-how-to-setup-ubuntu-16-04-lts-t3363669

10 总结

Android系统源码的编译就是不断和各种error做斗争的过程,考验程序员获取信息的能力,遇到error的时候只能各种百度搜狗,但这也是非常锻炼能力的过程,博主在编译过程中最大的体会就是:英语一定要好,哈哈。如果你成功编译出来了,或者编译遇到问题,欢迎给我留言。

11 转载请注明来自”梧桐那时雨”的博客:http://blog.csdn.net/fuchaosz/article/details/51487585

ubuntu16.04lts

Ubuntu16.04LTS 64位系统针对Android6.0sudoaptinstallgit-corebisonbuild-essentialcurlflexgitgnupggperflibesd0-devliblz4-toollibncurses5-devlibsdl-devlibwxgtk3.0-devlibxml2libxml2-utilslzopmavenopenjdk-7 查看详情

ubuntu16.04lts上用cmake编译安装opencv3

一、源码准备:opencv、cmake1、opencv官网https://opencv.org/下载源码包:opencv-3.4.0.tar.gz2、cmake官网https://cmake.org/下载源码包:cmake-3.10.2.tar.gz 二、安装cmake1、解压源码、进入解压后的目录    $ tar-zxvfcmake- 查看详情

设置sublime文本3以在ubuntu16.04lts上运行和编译java时出错

我是SublimeText3的新手,我想在SublimeText3上运行和编译java代码。但是,我得到了这个奇怪的错误:/bin/bash:javac:commandnotfound[Finishedin0.0swithexitcode127]和我在/home/***/Downloads/sublime_text_3/Packages/Java.sublime-package/JavaC.sub 查看详情

如何在 Ubuntu 16.04LTS 中禁用透明大页面 (THP)

】如何在Ubuntu16.04LTS中禁用透明大页面(THP)【英文标题】:HowtodisableTransparentHugePages(THP)inUbuntu16.04LTS【发布时间】:2017-06-2811:01:25【问题描述】:我正在设置一个带有3个运行Ubuntu16.04LTS的virtualboxVM的ambari集群。但是我收到以下警告... 查看详情

无法从 ubuntu 16.04 LTS 卸载节点

】无法从ubuntu16.04LTS卸载节点【英文标题】:Unabletouninstallnodefromubuntu16.04LTS【发布时间】:2018-07-0302:28:57【问题描述】:我尝试了这两个命令来卸载nodejs,但我无法做到。sudoapt-getpurgenodejssudoapt-getautoremove当我检查版本时,它会显... 查看详情

在 ubuntu 16.04 lts 上安装 numba 0.30.1

】在ubuntu16.04lts上安装numba0.30.1【英文标题】:Installnumba0.30.1onubuntu16.04lts【发布时间】:2017-06-2601:51:36【问题描述】:如何在Ubuntu16.04LTS上为Python3安装当前版本(0.30.1)的numba?我的Python版本是3.5.2,我安装了Ubuntu的准系统(我认为... 查看详情

在 16.04 LTS 上安装 Docker

....04LTS【发布时间】:2016-08-1103:00:34【问题描述】:如何在Ubuntu16.04LTS上安装docker【问题讨论】:docs.docker.com/engine/installation/linux/ubuntulinux涵盖16.04如果您有任何文章可以在Ubuntu16.04LTS上安装docker私有注册表,请 查看详情

ubuntudesktop16.04lts下成功配置jupyter的两个python内核版本(2.7x,3.5x)

   Ubuntu Desktop16.04LTS 安装好系统默认就有python两个不同版本(2.7.12和3.5.2) 现在来熟悉一下jupyter的对python这两个不同python版本的内核配置过程: 1.分别下载不同的python内核版本  命令如下: sudop... 查看详情

在ubuntu16.04lts上安装python3.6.0(代码片段)

原文连接:https://segmentfault.com/a/1190000007912666最近Python3发布了新版本Python3.6.0,好像又加入了不少黑魔法!~由于暂时不能使用apt-get的方式安装Python3.6,所以还是直接编译源码安装吧。官网上提供了Mac和Windows... 查看详情

markdown最安全的方法来清理启动分区-ubuntu14.04lts-x64,ubuntu16.04lts-x64(代码片段)

查看详情

我正在尝试运行 CUDA 示例,但我在 Ubuntu 16.04 LTS 上遇到了 openGL (libGLEW.a) 问题

】我正在尝试运行CUDA示例,但我在Ubuntu16.04LTS上遇到了openGL(libGLEW.a)问题【英文标题】:IamtryingtoruntheCUDAexamplebutihaveproblemswithopenGL(libGLEW.a)onUbuntu16.04LTS【发布时间】:2017-04-2100:36:51【问题描述】:我正在尝试在带有NsightEclipse版的... 查看详情

ubuntu16.04lts设定时区,同步时间

设定时区:dpkg-reconfiguretzdata      选择Asia->再选择Shanghai->OK同步时间命令:      1、sudoapt-getinstallntpdate//安装时间同步工具    &nbs 查看详情

如何在 Ubuntu 16.04 LTS 64 位上安装/启动 Postman 本机 v4.10.3?

】如何在Ubuntu16.04LTS64位上安装/启动Postman本机v4.10.3?【英文标题】:Howtoinstall/startPostmannativev4.10.3onUbuntu16.04LTS64-bit?【发布时间】:2017-08-1704:57:14【问题描述】:我下载了PostmanforLinux(来自https://www.getpostman.com/apps),将.tar.gz文... 查看详情

在ubuntu12.04lts下成功编译安装带有h264和aac编码的ffmpeg的完整过程(命令行)

在ubuntu12.04LTS下成功编译安装带有h264和aac编码的ffmpeg的完整过程(命令行),自己没试过的就算了参考技术A先下载最少yasm、ffmpeg、x264的源码,具体步骤和这个差不多。https://trac.ffmpeg.org/wiki/UbuntuCompilationGuideh.264通常只用x264一种。a... 查看详情

text用于ubuntu16.04lts(xenial64)box的vagrantfile(代码片段)

查看详情

如何在ubuntu16.04和14.04lts中安装postgresql9.5

参考技术A你好,ubuntu软件中心,还有可以从网站下载的deb文件也可以用gdebi或命令或新立德安装 查看详情

sh如何在ubuntu16.04lts-docker中安装python3.6。*(代码片段)

查看详情

在ubuntu16.04lts下搭建java开发环境

安装JDK1.71.下载所需jdk版本jdk-7u79-linux-x64.tar.gz:jdk历史版本下载路径2.解压文件解压后新增一个文件夹如下:3.创建一个文件夹保存解压后的文件:(/usr/lib一般存放不能直接运行的,却是许多程序运行所必需的一些函数库文件lin... 查看详情