一、源码下载
参看清华大学镜像源网站:https://mirror.tuna.tsinghua.edu.cn/help/AOSP/
1、下载 repo 脚本工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo > ~/bin/repo
chmod a+x ~/bin/repo
2、配置git账户信息
git config --global user.name "your name"
git config --global user.email "your_email@your_domain.com"
3、初始化repo和manifest仓库
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r77
上面的android-6.0.1_r77对应的具体android源码版本,如果你需要下载其他版本可以通过下面链接查看具体的版本分支
https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

4、同步下载源码树
repo sync
这样,源码就开始下载了,接下来就是漫长的等待。
二、相关配置
1、设置编译缓存
设置编译缓存的目的就是当你再次编译的时候,它可以帮你避免编译部分已经编译过的内容。
(1)设置环境变量,打开编译缓存
export USE_CCACHE=1
(2)设备编译缓存
prebuilts/misc/linux-x86/ccache/ccache -M 15G
输入上面命令之后,你会看到下面输出:
Set cache size limit to 15.0 Gbytes
2、配置Jack
Jack服务是用来构建ROM中的Java部分,它需要比较大的内存,为了避免内存分配错误,你可以使用环境变量ANDROID_JACK_VM_ARGS来设置允许Jack使用的存储大小,通常设置内存的50%就足够。
下面的命令就是分配一个8G的内存给Jack服务,并且阻止Jack需要的默认编译选项。
export ANDROID_JACK_VM_ARGS="-Xmx8g -Dfile.encoding=UTF-8 -XX:+TieredCompilation"
三、下载驱动
我们需要将Android6.0.1编译后烧录到Nexus 5上,所以需要下载对应的驱动。
https://developers.google.com/android/drivers#hammerheadm4b30z

下载得到的是三个tgz文件,我们只需依次解压三个文件,得到的是三个shell脚本文件,我们先将其置于源码根目录中。
依次执行这三个脚本文件,这里要注意,三个脚本文件的作用是生成驱动文件,但是在执行操作前,它会让你阅读相关协议,你必须一直按enter键一行一行往下读,更不能一键摁到底,因为程序在最后会让你输入“I ACCEPT”,如果你一键摁到底,也就是说最后一步也摁enter键的话它就会执行默认操作,即不接受此协议,那生成驱动文件的操作就不会执行。

四、编译源码
1、安装OpenJDK
See Installing the JDK for the prebuilt path and installation instructions for older versions.
- Android 7.0 (Nougat) - Android 8.0 (O release): Ubuntu - OpenJDK 8, Mac OS - jdk 8u45 or newer
- Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu - OpenJDK 7, Mac OS - jdk-7u71-macosx-x64.dmg
- Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6
- Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu - Java JDK 5
来源:https://source.android.com/setup/requirements
我们是编译Android 6.0,需要OpenJDK 7
sudo apt-get install openjdk-7-jdk
如果安装的时候出现找不到下载源,那么我们可能需要更新下载源。它对应的是/etc/apt/sources.list文件
文件/etc/apt/sources.list是一个普通可编辑的文本文件,保存了ubuntu软件更新的源服务器的地址。
(1)首先需要备份一下原有的sources.list文件
cd /etc/apt
sudo mv sources.list sources.list.cp //将原来的sources.list进行备份
sudo vim sources.list // 编辑sources.list
(2)然后直接替换掉sources.list内容,下面提供几个验证可用的安装源
如果需要安装OpenJDK 7
将sources.list内容替换成下面内容
参考链接:https://gist.github.com/veian/8395040
deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse
然后执行下面命令:
sudo apt-get update
sudo apt-get install openjdk-7-jdk
如果需要安装OpenJDK 8
将sources.list内容替换成下面内容
参考链接:https://mirrors.cloud.tencent.com/help/ubuntu.html
deb http://mirrors.cloud.tencent.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.cloud.tencent.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.cloud.tencent.com/ubuntu/ xenial-updates main restricted universe multiverse
#deb http://mirrors.cloud.tencent.com/ubuntu/ xenial-proposed main restricted universe multiverse
#deb http://mirrors.cloud.tencent.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ xenial-updates main restricted universe multiverse
#deb-src http://mirrors.cloud.tencent.com/ubuntu/ xenial-proposed main restricted universe multiverse
#deb-src http://mirrors.cloud.tencent.com/ubuntu/ xenial-backports main restricted universe multiverse
然后执行下面命令
sudo apt-get update
sudo apt-get install openjdk-8-jdk
下面提供几个下载源地址:
http://mirrors.aliyun.com/help/ubuntu
http://mirrors.163.com/.help/ubuntu.html
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
https://lug.ustc.edu.cn/wiki/mirrors/help/ubuntu
https://www.cnblogs.com/dtiove/p/5917263.html
2、编译源码
(1) 初始化编译环境 source或者(.)都可以执行一个shell脚本
source build/envsetup.sh
或者
. build/envsetup.sh
(2) 选择编译目标
lunch在这一步中,我们选择:aosp_hammerhead_userdebug,因为我们的Nexus 5设备代号就是hammerhead。

(3) 开始编译 -jN:job,开多少个任务去执行编译。
使用nproc命令查看有多少个CPU来决定开多少个任务
make -j8
接下来就是就是编译的过程了,又是漫长的等待
编译可能会遇到的问题:
https://blog.csdn.net/a4262562/article/details/52799037
https://www.jianshu.com/p/9f3aa30cb495
五、将镜像刷入Nexus5
在源码根目录下输入以下命令:
sudo adb reboot bootloader
随后手机就会进入recovery模式。
然后,我们开始刷机:
fastboot -w flashall
刷机的过程大概在一至两分钟左右,刷机结束后会自动开机。
参考链接:
https://www.digitalocean.com/community/tutorials/how-to-build-android-roms-on-ubuntu-16-04
https://blog.csdn.net/liu1075538266/article/details/51272398
https://www.jianshu.com/p/6b2de1c4a1bc