Ubuntu 15.04编译Android 6.0.1源码-Nexus5真机编译

1,768 阅读4分钟

一、源码下载

参看清华大学镜像源网站: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