使用虚拟机中的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
由于在编译的时候会出现如下错误
这里先配置好,可以避免编译时出现这个错误。
打开用户目录下的.bashrc文件,即~/.bashrc文件。
在文件最后添加
export LC_ALL=C
如图所示
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 https://aosp.tuna.tsinghua.edu.cn/platform/manifest
然后执行如下命令可以查看可以下载的android源码分支.
cd .repo/manifests.git/
git branch -a
这里同步android-8.1.0_r41分支并拉取对应分支源码
repo init -u https://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信息。
出现如下所示表示编译成功。
7、运行模拟器
在完成编译后,我们可以直接通过emulator命令来运行模拟器
emulator
运行出如图所示的界面表示模拟成功。