在ubuntu16.04上编译android源码【转】
本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585
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
感谢下面这位博主上传源码,我也是从他的博客下载的源码:
下载源码请在Windows下面下载,迅雷不解释。
注意:源码的存放路径不能有中文,否则编译到系统内置的apk的时候会报错无法解析class.dex文件
(2) 解压源码,合并文件。
下载完毕后,使用下面命令合并:
cat Android6_r1_*>Android6_r1.tgz
- 1
- 1
合并完后,使用下面命令校验hash:
md5sum Android6_r1.tgz
- 1
- 1
此时会生成一个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 更换软件源为阿里云
为了更快的安装软件,我们需要更换软件源为国内的软件源,这里推荐使用Ubuntu官方指定的国内软件源阿里云,博主之前使用的是网易的软件源,结果发现OpenJDK7装不上去,于是换成了阿里的,具体方法是:
sudo gedit /etc/apt/sources.list
- 1
- 1
在文件最前面加入下面代码:
deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
5 安装依赖
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Ubuntu 16.04请务必使用上面的依赖,Ubuntu 16.04需要的依赖和Ubuntu 14.04所需要的依赖是不同的,博主照着Ubuntu 14.04的依赖结果掉进大坑,详见后面的编译过程记录.
6 安装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
- 1
- 2
- 3
- 1
- 2
- 3
配置OpenJDK.打开/etc/profile文件:
sudo gedit /etc/profile
- 1
- 1
在末尾追加下面代码:
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
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
修改了/etc/profile文件需要重启才能生效,但使用下面命令可以在不重启的情况下在当前bash环境生效:
source /etc/profile
- 1
- 1
检查OpenJDK配置是否正确:
java -version
- 1
- 1
配置正确则如下图:
7 修改源码
修改 mydroid/art/build/Android.common_build.mk
文件,定位到75行,将下面的代码:
ifneq ($(WITHOUT_HOST_CLANG),true)
- 1
- 1
改为:
ifeq ($(WITHOUT_HOST_CLANG),false)
- 1
- 1
如果不修改这里,会遇到一个比较棘手的编译错误,修改的目的是把CLANG这个编译选项关掉,详见后面的编译记录,百度搜狗都无解,这个错误只会在Ubuntu16.04上遇到,Ubuntu14.04则不存在这个问题,解决这个编译错误花费一天时间,还好咱英语好,在歪果人的论坛上看了几篇帖子,终于搞定了。这里顺便说一下小技巧:
遇到编译错误,请把error后面的错误信息全部复制,然后用搜狗搜英文网页,不要用百度那个渣渣
8 开始编译
(1) 在 .bashrc文件末尾添加:export USE_CCACHE = 1
echo export USE_CCACHE=1 >> ~/.bashrc
- 1
- 1
(2) 为了提高编译效率,设置编译器高速缓存:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
- 1
- 1
(3) 接着导入编译Android源码所需的环境变量和其它参数:
source build/envsetup.sh
- 1
- 1
(4) 运行lunch命令选择编译目标:
lunch
- 1
- 1
选择1:
(5) 开始编译,执行make -j8, 8为同时编译的线程数,一般google推荐这个数字为2倍的cpu个数再加上2,比如4核,就是10。博主使用的是8:
make -j8
- 1
- 1
关于cpu个数,可以用下面命令查看:
cat /proc/cpuinfo
- 1
- 1
好了,开始编译了,接下来就是不断error,不断修复,继续编译的过程,下面记录我的爬坑经历
9 编译记录
我是参照下面这篇文章开始编译的:
如果一帆风顺,我也就用不着写这篇博客了,然而他用的是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
- 1
- 1
其实这个是系统使用clang编辑器报的错,百度了一下,解决方法一般是将art/build/Android.common_build.mk
文件ifneq ($(WITHOUT_HOST_CLANG),true)
改为ifeq ($(WITHOUT_HOST_CLANG),false)
然而纸上得来终觉浅,绝知此事要躬行,因为,这并没有什么卵用,至少现在没有卵用。不信,请看下面的帖子:
我试了一下,也没用,还是没解决问题,好像这个是新系统的兼容问题,百度搜狗一天,没有进展,后来发现了下面这篇帖子,也是14.04编译Android6.0的:
抱着反正无聊试一试的想法,把上面这篇帖子中的依赖一通复制(所以最终用的依赖是两篇帖子加起来的依赖):
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
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
然后make clean
,重新再来,接着就睡觉去了。
一觉醒来,然后……..你以为我就编粗来了?呵呵,这个错误是终于编过去了,可是又遇到下面的错误:
解决这个错误,又花费一番力气,在歪果人的论坛上看到下面这篇帖子:
注意看这个帖子的15楼,哈哈,这个时候找到解决方法了,再修改art / build/Android.common_build.mk
文件
ifneq ($(WITHOUT_HOST_CLANG),true)
- 1
- 1
改为:
ifeq ($(WITHOUT_HOST_CLANG),false)
- 1
- 1
重新编译,解决问题。
(4) 中文路径,坑。
遇到这个问题也是很难百度到,哎,最后把源码换到了全英文的路径下面,解决这个问题。注意移动源码的时候不要直接复制mydroid文件夹,一个小时都复制不完,所以正确的方法是复制压缩包,然后再解压一遍。
接下来就编译成功了。
10 编译成功
编译成功后如下图:
进入mydroid/out/target/product/generic目录,可以看到编译好的文件:
启动模拟器:
emulator
- 1
- 1
稍等一会,就可以出现开头的模拟器画面了,哈哈,打完收工。
11 附录: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
12 总结
Android系统源码的编译就是不断和各种error做斗争的过程,考验程序员获取信息的能力,遇到error的时候只能各种百度搜狗,但这也是非常锻炼能力的过程,博主在编译过程中最大的体会就是:英语一定要好,哈哈。如果你成功编译出来了,或者编译遇到问题,欢迎给我留言。
13 转载请注明来自”梧桐那时雨”的博客:http://blog.csdn.net/fuchaosz/article/details/51487585
Tips
如果觉得这篇博客对你有帮助或者喜欢博主的写作风格,就给博主留个言或者顶一下呗,鼓励博主创作出更多优质博客,Thank you.
在ubuntu16.04上编译android源码【转】的更多相关文章
- 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)
原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...
- 在Mac mini上编译Android源码
参考文章 1.Android 6.0 源代码编译实践 2.编译Android源码致命错误解决方案 实践过程 1.Mac下安装Ubuntu双系统 (1)Ubuntu版本:Ubuntu 15.10 注:实 ...
- ubuntu10.04 32 编译android源码的问题
ubuntu10.04 32 问题 没有jdk1.6 并且使用apt-get 安装jdk相当麻烦,参照:http://blog.csdn.net/godvmxi/article/detail ...
- ubuntu16.04上编译android的可执行文件并调用本地so库
前言: 找了蛮多资料的,发现目前实现的编译方式大致就两种,一种是直接使用android源码中的编译工具链,另一种就是使用独立的交叉编译工具链,第二种我还在实现中,配置步骤挺多的 ,第一种实现方式挺方便 ...
- Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决
昨晚在编译源码,make一段时间之后报错如下: # A fatal error has been detected by the Java Runtime Environment: # # SIGSE ...
- [原]编译Android源码过程中遇到的问题
编译Android源码的过程参考Android官网介绍: 1.下载Android源码的步骤:https://source.android.com/source/downloading.html 2.编 ...
- 一次编译Android源码实验
注意,本文只供参考,是老文章 1.必要的软件环境 sudo apt-get install build-essential sudo apt-get install make sudo apt-get ...
- wubi安装ubuntu后,增加swap大小,优化swap的使用参数-----------让ubuntu健步如飞,为编译android源码准备
wubi安装ubuntu后,终端输入free -m可以查到如下信息: total used free shared buffers cached Mem: 1944 1801 143 0 557 70 ...
- 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)
2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...
随机推荐
- 【APIO2015】Jakarta Skyscrapers
题目描述 印尼首都雅加达市有 $N$ 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 $0$ 到 $N − 1$.除了这 $N$ 座摩天楼外,雅加达市没有其他摩天楼. 有 $M$ 只叫做 ...
- Codeforces 235 E Number Challenge
Discription Let's denote d(n) as the number of divisors of a positive integer n. You are given three ...
- PHP运行环境搭建
说明 我的百度百度云盘里面有apache24,PHP7.0,mysql5.6,如果需要的话可以直接下载: apache的环境我已经配置好了,将其解压到C盘根目录 相应绝对路径为C:\Apache24 ...
- PyTorch框架+Python 3面向对象编程学习笔记
一.CNN情感分类中的面向对象部分 sparse.py super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义 ...
- SQL 列转行与行转列
假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94*/ -------------- ...
- Parallel Database for OLTP and OLAP
Parallel Database for OLTP and OLAP Just asurvey article on materials on parallel database products ...
- mac下报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
如题mac下遇到错误: 解决办法:安装mac的命令行工具CommandLineTools xcode-select --install
- 爬虫基本操作、requests和BeautifulSoup
1. 爬虫基本操作 例如舆情系统: 获取汽车之家新闻放到自己数据库里,创建自己的app,发布内容,注明来源,自己创业. URL指定内容获取到 - 发送Http请求:http://www.autohom ...
- 使用 kexec 快速重启 Linux
http://www.ibm.com/developerworks/cn/linux/l-kexec/ 简介: 即使您的工作不要求您每天多次重新启动您的 Linux 机器,等待系统启动也实在是一件枯燥 ...
- shell grep正则匹配汉字
Shell grep正则匹配中文 测试文本 demo_exe.c,内容如下,需要注意保存的编码格式,对输出到终端有影响: 我们中文操作系统ASNI默认是GBK的. #include<stdio. ...