使用虚拟机中的Ubuntu18.04编译android8.1
1、软硬件要求
1.1、硬件

16G的内存;200G的存储盘。
1.2、软件

Ubuntu18.04
这样的软硬件要求并非必须,但是经过测试这样的配置刚好能够正常编译android8.1。
200G的存储盘,正常编译完成,加上虚拟机的大小总共占了190G左右。期间没有删除任何过程文件。
2、确保Ubuntu的apt-get命令能够正常使用

在开始工作时,首先要保证

sudo apt-get update

命令能够正常执行,即首先执行该命令保证apt-get是最新的。
由于工作网络的限制,在使用学校和公司网络时,有可能造成get-apt命令无法使用的问题。即在使用该命令时会出现类似于如下这种错误:

E: 无法下载 http://cn.archive.ubuntu.com/ubuntu/dists/xenial/InRelease 明文签署文件不可用,结果为‘NOSPLIT’(您的网络需要认证吗?)
E: 无法下载 http://cn.archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease 明文签署文件不可用,结果为‘NOSPLIT’(您的网络需要认证吗?)
E: 无法下载 http://cn.archive.ubuntu.com/ubuntu/dists/xenial-backports/InRelease 明文签署文件不可用,结果为‘NOSPLIT’(您的网络需要认证吗?)
E: 无法下载 http://security.ubuntu.com/ubuntu/dists/xenial-security/InRelease 明文签署文件不可用,结果为‘NOSPLIT’(您的网络需要认证吗?)
E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。

出现这种问题可能是由于使用的网络有问题,所使用的网络把一些源屏蔽掉了。
解决办法是使用私人网络,或者没有加特殊限制的网络,一般家庭网络不会出现类似问题。
3、Ubuntu 18.04配置编译环境
3.1、配置Java8

sudo apt-get install openjdk-8-jdk
sudo apt-get install openjdk-8-jre

3.2、下载一些依赖

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
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 libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache

由于在编译的时候会出现如下错误

Ubuntu Android模拟器_Ubuntu Android模拟器


这里先配置好,可以避免编译时出现这个错误。

打开用户目录下的.bashrc文件,即~/.bashrc文件。

在文件最后添加

export LC_ALL=C

如图所示

Ubuntu Android模拟器_Android_02


4、安装git和repo

4.1、安装git代码管理器

如果之前已经安装配置过git,该步骤可以省略。
如果没有则执行如下命令。

sudo apt-get install git

想要正常使用git命令还需配置git的Email和name。

git config --global user.name "your name"
git config --global user.email "XXX@XXX.com"

4.2、下载repo

repo是Android为了方便管理多个git库而开发的Python脚本。repo的出现,并非为了取代git,而是为了让Android开发者更为有效的利用git。

Android源码包含数百个git库,仅仅是下载这么多git库就是一项繁重的任务,所以在下载源码时,Android就引入了repo。

git clone https://aosp.tuna.tsinghua.edu.cn/git-repo/

下载完后,为repo脚本添加可执行权限:

chmod a+x git-repo/repo

然后添加repo(路径目录如:~/git-repo/repo)到PATH环境变量

export PATH=~/git-repo:$PATH

然后到打开~/git-repo/repo文件,将REPO_URL替换为清华镜像地址,以避免下载android源码时可能出现的无法连接到 gerrit.googlesource.com问题。

REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

替换后如下所示。

# repo default configuration
#
# REPO_URL = os.environ.get('REPO_URL', None)
REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
if not REPO_URL:
  REPO_URL = 'https://gerrit.googlesource.com/git-repo'
REPO_REV = os.environ.get('REPO_REV')
if not REPO_REV:
  REPO_REV = 'stable'

由于repo脚本是使用python写的。所以虚拟机里面必须安装python才能执行repo脚本。

sudo apt-get install python

5、下载android源码

首先创建一个自己存放源码的目录,我是放在~/Android/source路径下的,然后cd到对应的路径下执行下面命令

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

然后执行如下命令可以查看可以下载的android源码分支.

cd .repo/manifests.git/
git branch -a

这里同步android-8.1.0_r41分支并拉取对应分支源码

repo init -u git://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r41
repo sync

这个过程很漫长,具体时间依据网速而定。我同步了大概7个小时。
如果中间由于网络问题同步失败,可以重复执行

repo sync

如果一切正常最后同步完成之后,会自动将文件checkout,并显示成功。
6、编译Android源码

进到源码目录执行

. build/envsetup.sh

初始化编译环境后,引入了一些执行脚本,其中就包括马上要使用的lunch指令。通过lunch指令可以设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上。这里我们设置的编译目标是aosp_arm64-eng,因此执行指令

lunch aosp_arm64-eng

简单的说明下,aosp表示Android Open Source Project,arm64表示是使用arm64 cpu的设备,eng表示engineer版本,其直接开放了一些root等权限。当然直接使用lunch命令会列出所有可选的编译目标。

最后,我们便可通过如下命令来开始编译andriod源码

make -j8

这里的j8表示可以开启8个线程来参与编译源码,这里指定的线程数一般应该遵从cpu内核数的2倍这个规律,可以通过cat /proc/cpuinfo查看相关cpu信息。

出现如下所示表示编译成功。

Ubuntu Android模拟器_git_03


7、运行模拟器

在完成编译后,我们可以直接通过emulator命令来运行模拟器

emulator

运行出如图所示的界面表示模拟成功。

Ubuntu Android模拟器_Ubuntu Android模拟器_04