参考文章

1.Android 6.0 源代码编译实践

2.编译Android源码致命错误解决方案

实践过程

1.Mac下安装Ubuntu双系统

(1)Ubuntu版本:Ubuntu 15.10

注:实际上一开始我是从Ubuntu 16.04 LTS开始的,但编译过程中出现提示需要OpenJDK1.7的情况,但是Ubuntu 16.04 LTS的软件包里只有OpenJDK1.8 和OpenJDK1.9.

于是我换成了Ubuntu 15.10,虽然它不是LTS版本,但是它的OpenJDK版本比较齐全。

当然后来编译时又提示需要OpenJDK1.8,所以这个选择还算明智。

可以在这里看到Ubuntu各个版本对应的软件包。

Ubuntu的各个版本列表在这里

(2)制作ubuntu安装U盘

下面分别是Ubuntu和Mac下制作安装U盘的步骤。

---》直接在Ubuntu系统下制作安装U盘

---》How to install Ubuntu on MacBook using USB Stick

(3)分盘以及安装

参考:mac如何安装linux

2.下载Android源码

(1)清华大学镜像源

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

(2)下载repo工具

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

(3)安装git

sudo apt-get intstall git

(4)初始化仓库

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

Android版本、源码和API Level对应关系

会出现错误,提示配置git帐号。

git config --global  user.emall "xxx@xxx.com"
git config --global user.name "xxx"

配置完成后重新初始化即可。

(5)同步

由于首次同步需要下载 24GB 数据,过程中任何网络故障都可能造成同步失败,选择下载每月更新的初始化包。

下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以最新的每月包中,只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码

大约4个小时,24G的文件下载完毕,开始解压,然后同步,时长大约两个小时。解压后是看不到文件里面有东西的。

同步结束,文件夹就会出现这些内容,这就是最新的Android系统源码(不知道为什么有24G这么大!!!是因为repo吗?同步完毕后,这个文件夹已经变成约42G大小了。不想说什么,只能说这个磁盘一定要够!!!我用的分区是ext4格式,大小有86G,源码编译完,只剩2G了)。

(6)关于移动硬盘

由于我是在公司的Mac mini上进行编译,但是这台mac mini很老了,安装ubuntu系统,内存只有2G,编译速度非常的慢。

打算做持久战的我,把AOSP源码复制到了我的移动硬盘上,一是做备份(毕竟24G下载下来再花两个小时同步很不容易!!!!),二是下班后可以带回家,用家里的电脑(注明:这台是普通的Acer电脑,不是苹果电脑)继续编译。。。

一开始没想那么多,移动硬盘依然是NTFS分区,于是,出现了下面的状况:

问题原因: AOSP文件夹在移动硬盘里面,但是分区格式是NTFS格式的,不支持Linux的文件权限,无法把文件当做Program执行。

解决办法:参考这里

没办法,在移动硬盘里又分了一个区,格式化为ext4格式,把AOSP文件夹复制过去,约42G大小。

复制完发现,唉,没有root权限进行读写。

参考这篇文章解决:ext4格式移动硬盘挂载普通用户权限控制

获得用户权限后,将AOSP下所有文件和文件夹权限改为可读可写可执行。

chmod -R 777 ./AOSP

(7)关于无线网卡驱动

在Mac mini中安装完Ubuntu 15.10后,重启系统,发现Wifi连不上~~泪目~~(注:Ubuntu 16.04 LTS安装完没有出现这种情况。)

解决办法:Android手机通过USB共享网络,然后安装无线网卡驱动。(我没有公司的上网权限,所以只能靠Wifi和手机了~)

参考:ubuntu14.04无线网卡驱动安装

无线网卡类型:

直接按照博文的步骤进行,重启电脑,wifi就能用了。

3.编译Android源码

(1)配置编译环境变量

参考博文:Android 6.0 源代码编译实践

第一个步骤是在终端中进入源码根目录:

cd ~/AOSP

然后使envsetup.sh生效,用lunch选择编译版本,关于envsetup

source ./build/envsetup.sh
lunch

这么多个版本如何区分,我并没有找到详细的资料,我选择的是第6个,aosp_x86_64-eng。

更多资料:理解 Android Build 系统

(2)编译

make -j4

这里直接参考文章里作者用的-j4参数,我并没有具体分析CPU/内核等与-jN的关系。能用就行。

(3)安装必要组件

出现了很多问题,每次编译时间较长,参考在Ubuntu-14.04.3配置并成功编译Android6_r1源码这篇文章安装了一些组件:

sudo apt-get install -y git flex gperf build-essential libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib tofrodos python-markdown xsltproc zlib1g-dev:i386 dpkg-dev libsdl1.2-dev libesd0-dev libxml2-utils

(4)安装OpenJDK1.8

关于OpenJDK版本或者JDK已在前面提过,只能说,make之后,按照提示再作安装吧。

下面还是写一下JDK 和 OpenJDK的安装过程,留着以后用。

------》安装OpenJDK

官网:http://openjdk.java.net/

sudo apt-get install openjdk-8-jdk

安装很简单,上面一句命令就可以了。

------》安装JDK

Oracle官网下载JDKWithNetbeans(jdk-8u91-nb-8_1-linux_x64.sh),也可以下载不带有netbeans的,但是这个比较快,而且万一以后要用到NetBeans呢。

sudo chmod +x ~/jdk-8u91-nb-8_1-linux-x64.sh
sudo ~/jdk-8u91-nb-8_1-linux-x64.sh

在~/.bashrc中配置环境变量:

export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source ~/.bashrc

-------》检查JAVA版本

注意:OpenJDK和JDK最好不要一起安装,免得编译过程中一些库调用混乱,当然,配置好环境变量应该也可以避免这种情况的发生。

java -version

(5)安装bision

解决办法:http://www.cnblogs.com/muhe221/articles/5047178.html

sudo apt-get install bison

(6)安装32位兼容库

解决办法:prebuilts/misc/linux-x86/bison/bison: 没有那个文件或目录

ubuntu 64位系统运行32位程序的问题,需要安装运行32位程序的兼容库

sudo apt-get install lib32ncurses5
sudo apt-get install lib32stdc++

(7)增加虚拟内存

解决办法:

内存不够,增加虚拟内存。

sudo -s
dd if=/dev/zero of=/swapfile bs=4M count=

保护Swap分区:

chown root:root /swapfile
chmod /swapfile
ls -lh /swapfile

启动swap分区:sudo mkswap swapfile

sudo mkswap /swapfile 

激活swap分区:

swapon /swapfile

在Ubuntu上验证:

 swapon –s

更新/etc/fstab 文件,增加内容:

# swap
/swapfile none swap sw

(8)使用Super User权限

为什么权限还是不够呢?!!!!!

不管了,简单粗暴,直接用root来进行编译好来(感觉前面白忙活了~~~呜呜呜~~~)

sudo  passwd root
su root

切换到root帐号后,如果提示没有找到java,则需要重新修改~/.bashrc,设置JAVA环境变量。

(9)物理内存与swap分区的比率

解决办法:Ubuntu虚拟机编译Android6.0总结

担心内存不够,又增加了一个虚拟内存。然后配置物理内存与swap分区的比率。

不知道这个数字是否合理,因为后面编译过程中Ubuntu十分卡顿,只能强制关机,重启后继续。

参考:swappiness设置实际内存和swap的使用比率 /ubuntu优化

sysctl -q vm.swappiness
sudo sysctl vm.swappiness=

(10)Jack 和-Xmx

解决办法:Android 源码编译错误

gedit ./prebuilts/sdk/tools/jack-admin
gedit ./out/host/linux-x86/bin/jack-admin

还有尝试修改max-service。

sudo gedit /root/.java-server/config.properties
jack.server.max-service=

最好在make之前,启动Jack-Server:

./out/host/linux-x86/bin/jack-admin kill-server
./out/host/linux-x86/bin/jack-admin start-server

这个问题是编译过程中最严重的一个问题,一直伴随到编译结束,有时候会一直卡顿在类似下面的语句,半小时之后没有任何更新,系统异常卡顿,鼠标无响应,这种情况下,只能强制关机后,重新继续编译。

感觉这个问题应该是内存不足的原因,我家里电脑的内存是4G,编译速度明显会快很多,但是编译一段时候后依然会卡在这类似的地方,同样,如果强制退出无响应,就只能强制关机再重启。

(11)编译中断后,如何继续编译?

这个就很重要了,硬件配置不够,总是编译中断在Jack的问题上,每次编译耗时又很长,怎么办呢?

得想办法让编译过的不再重新编译,参考:编译android源码时,意外中断,如何能让其接着编译?

编辑 build/core/cleanbuild.mk,

上面的这个图没有截完整哦,else对应的if也要注释掉的。

(12)编译完成

在不断卡在Jack Server,不断强制关机重启电脑之后,进度条终于到了100%,编译完成。

4.关于Jack

Jack不是一个人名,也不是耳机~~,Jack的全称是:Jack (Java Android Compiler Kit)

还翻不了墙的我,查不到关于Jack的详细资料,以后到墙的另一面再查查吧。

Android源码目录结构

编译完了,可是并不了解源码里具体是什么东西,更不知道编译出来的是什么。

看看几篇博文,初步了解一下吧:

最全的Android源码目录结构详解

在Mac mini上编译Android源码的更多相关文章

  1. 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)

    原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...

  2. 在ubuntu16.04上编译android源码【转】

    本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

  3. [原]编译Android源码过程中遇到的问题

    编译Android源码的过程参考Android官网介绍: 1.下载Android源码的步骤:https://source.android.com/source/downloading.html 2.编 ...

  4. 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)

    2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...

  5. 一次编译Android源码实验

    注意,本文只供参考,是老文章 1.必要的软件环境 sudo apt-get install build-essential sudo apt-get install make sudo apt-get ...

  6. 【转】在Ubuntu下编译Android源码并运行Emulator

    原文网址:http://www.mcuos.com/thread-4553-1-1.html 建立编译环境 1.在VirtualBox上安装Ubuntu 2.安装JDK   $ sudo apt-ge ...

  7. Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

    昨晚在编译源码,make一段时间之后报错如下: # A fatal error has been detected by the Java Runtime Environment: # # SIGSE ...

  8. wubi安装ubuntu后,增加swap大小,优化swap的使用参数-----------让ubuntu健步如飞,为编译android源码准备

    wubi安装ubuntu后,终端输入free -m可以查到如下信息: total used free shared buffers cached Mem: 1944 1801 143 0 557 70 ...

  9. Ubuntu编译Android源码过程中的空间不足解决方法

    Android源码一般几十G,就拿Android5.0来说,下载下来大概也有44G左右,和编译产生的文件以及Ubuntu系统占用的空间加起来,源码双倍的空间都不够有.编译源码前能分配足够的空间再好不过 ...

随机推荐

  1. eclipse使用国内镜像站点安装插件

    把eclipse 4.x的界面改为经典样式 打开eclipse,菜单栏>windows>preference>general>appearance>theme>cl ...

  2. Code::Blocks快捷键操作

    编辑器 快捷键 功能 Ctrl+Z 恢复上一次操作 Ctrl+Shift+Z 重复上一次操作 F11 切换头文件/源文件 Ctrl+Shift+C 注释高亮代码 Ctrl+Shift+X 反注释高亮代 ...

  3. 屠蛟之路_蛟灵岛战役(上)_SixthDay

    乘风破浪,屠蛟少年们终于到达beta怪蛟大boss的老巢--蛟灵岛. 这是一座孤立在东海深处的荒岛,岛上黑烟缭绕.瘴气重重,屠蛟少年们一登岛,就感受到浓浓的腥味和妖气. 果然,再小心翼翼,走两步居然陷 ...

  4. Beta版本——第三次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  5. myeclipse 破解步骤

    Fllow Orders.0. Close MyEclipse Application(if you wanna replace jar file).1. Fill usercode2. Fill s ...

  6. GoLang之网络

    GoLang之网络 Go语言标准库里提供的net包,支持基于IP层.TCP/UDP层及更高层面(如HTTP.FTP.SMTP)的网络操作,其中用于IP层的称为Raw Socket. net包的Dial ...

  7. 工具,百度编辑器 UEditor 使用实例化

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  8. Winform端上传图片到服务器

    转载自  在winform实现文件上传到服务器 webform上传文件可能大家都写过很多,一个HtmlInputFile.PostedFile.SaveAs就搞定了,不过不知道大家有没有在winfor ...

  9. 对AccessViolationException的一些总结

    引言 开发Winform程序时,应用程序出现了异常,整个应用程序崩溃自动退出了.在断点调试后,发现异常是AccessViolationException.所以对周围的语句加上了异常的处理机制.但是接下 ...

  10. 好看的CSS按钮

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...