参考文章

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. NSString,NSArray,NSNumber等类的继承问题

    问题引入,我想给NSString类扩展一些新的方法.在Objective-C中可以有两种方法,一是继承,二是类别.本文先不讨论类别,我们用继承的方法试一下: @interface StringEx : ...

  2. IPython, Notebook, NumPy, SciPy, matplotlib 和其它

    安装这些工具pip install ipython pip install notebookpip install numpypip install scipypip install matplotl ...

  3. jQuery倒计时

    Css------------------------------------------------------------------------------------------------- ...

  4. & fg jobs bg

    & 执行程序的后面加&可以将程序转到后台(这个后台是当前会话的后台,并不是守护进程)执行,即$./a.out &,这样我们在打开诸如$gedit test.txt的时候可以写成 ...

  5. Scala编程第二课

    函数式编程 函数式编程,结构化编程,OO编程都是编程的方法论. 函数式编程主要思想是把运算过程尽量写成一系列嵌套的函数调用. 特点如下: 1.函数可以像其他数据类型一样使用 可以可以赋值给其他变量,可 ...

  6. 查看Linux硬件配置信息

    在网上找了N久,发现了一篇不错的文档,转载一下: 1.查看机器所有硬件信息: dmidecode |more dmesg |more 这2个命令出来的信息都非常多,所以建议后面使用"|mor ...

  7. 【Swift】 GET&POST请求 网络缓存的简单处理

     GET & POST 的对比 源码:https://github.com/SpongeBob-GitHub/Get-Post.git 1. URL - GET 所有的参数都包含在 URL 中 ...

  8. 《天书夜读:从汇编语言到windows内核编程》十 线程与事件

    1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...

  9. 数据库事务的4个特性ACID

    原子性(Atomicity[ætə'mɪsɪti])原型atomic.一致性(Consistency).隔离性(Isolation).持久性(Durability)

  10. win10系统同时安装python2和python3

    1.官网下载python2和python3版本 2.安装python3,勾上Add Python3.5 to PATH,自定义选择安装目录,安装,验证:WIN+R--->cmd,输入python ...