因为我有一台12核24线程 64g内存的1.5T固态+1T机械的服务器,服务器安装了PVE虚拟机,昨天刚把PVE从6.4升级为7.0,然后就想着要编译android 11的源码,编译源码当然选择最新的长期支持版ubuntu,也就是目前的ubuntu20.04,于是官网下载了镜像文件,下载地址:https://ubuntu.com/download/desktop,装桌面版是因为可以应对后面在图形化界面中很方便解决的问题。

我给虚拟机分配了10个核心,16g内存,300g硬盘(固态),安装过程略。因为我的家庭网络采用了双软路由方案(爱快+LEDE),所以,你懂得,我不需要设置什么软件源,因为我畅通无阻,但是android 11 源码将近90g,走国外的话,这流量费用。。。所以下源码的时候我还是决定使用国内镜像下载。其他比如软件更新什么的那点流量就忽略不计了。

PVE中装完ubuntu20.04,第一件事:

#不管三七二十一,所有软件更新到最新再说
sudo apt-get update && upgrade
#安装vim 方便后面在终端编辑
sudo apt-get install vim
#安装ssh server 安装完后可以在本地电脑上ssh连接操作了
sudo apt-get install openssh-server
# 编辑ssh_config 将这个注释去掉 PasswordAuthentication yes 保存
vim /etc/ssh/ssh_config
#重启下ssh
sudo /etc/init.d/ssh restart

接着,在本地电脑的终端上

#ssh登录ubuntu
ssh 用户名@ip

安装编译android所有需要的依赖(以下的操作建议先安装screen,然后在screen中操作,因为这样可以保证退出终端后任务还继续执行,下次进来想要展示之前的命令窗口也非常方便,具体的screen用法参考我的 另一篇文章https://www.lategege.com/?p=254 mac、linux下操作一摸一样)

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 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
sudo apt-get install libssl-dev

这里要注意有坑,第一个坑是libesd0-dev 这个软件包 在ubuntu默认源中是没有的,所以要添加源然后更新下软件列表再安装

sudo vim /etc/apt/sources.list  //在行尾添加下面这个源保存
deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse

#安装libesd0-dev
sudo apt-get update && sudo apt-get install libesd0-dev

第二个坑是关于lib32ncurses5-dev的,这个包安装不上。在安装的时候发现要安装libncurses5-dev,但是我软件包都更新为最新版本的了,也就是libncurses5-dev 最新版本是6.2的,我查看了下/usr/lib/x86_64-linux-gnu  这个目录下的动态库,发现只有libncurses.so.6,这就是因为libncurses5-dev这个包太新了,已经更新到6.2了,所以没有libncurses.so.5,因为后面编译需要有libncurses.so.5,不然编译会报错,我想了下有两种方案:一种libncurses5-dev回退到5.9,但是其他也有可能有依赖,又因为libncurses.so.6依赖了libtinfo.so.6,所以干脆如下暴力处理(后面的编译报错问题解决):

cd /usr/lib/x86_64-linux-gnu
sudo cp libncurses.so.6 libncurses.so.5
sudo cp libtinfo.so.6 libtinfo.so.5
#装完软件需要设置下git的用户名密码,可以随意,但是这步是必须的,因为拉android源码的时候会验证git是否设置的email和name 不设置就不让拉取,http.sslverify https.sslverify 也配置下,后面拉取https仓库有时候报验证证书失败,配了这两个后就不会报错了。
git config --global user.email "xxx@xxx.com"
git config --global user.name "xxx"
git config --global http.sslverify false
git config --global https.sslverify false

接着就是拉取源码了,谷歌建议在home目录建一个bin文件夹,源码下载到这里,当然这只是建议,这边就按照谷歌的建议来操作。

#在当前用户家目录创建bin文件夹
mkdir ~/bin
#将该目录写入环境变量
echo "PATH=~/bin:\$PATH" >> ~/.bash_profile
#刷新环境变量
source ~/.bash_profile

补充知识:环境变量分为/etc目录下全局的和每个用户下面独立的,每个用户独立的又有两处可以放,.bashrc 或者.bash_profile 因为.bashrc本身有很多代码,所以建议建立独立的.bash_profile文件存放环境变量。

#拉取谷歌的代码管理脚本repo
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
#不能科学上网的 从清华镜像获取 两个都是一样的 curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
#授权执行权限,repo本质就是一个python2的脚本
chmod a+x ~/bin/repo
#初始化repo 就是设置url为镜像地址 android-11版本在不断更新,可以去https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds这个官网地址查看最新版本是多少,针对的设备是哪些,再决定拉取哪个代码。
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-11.0.0_r43

## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

#由于清华大学镜像对并发是有限制的,这里就看自己测试下来能最大几个就填-jX
repo sync -j4 --fail-fast --force-sync
#拉完代码就是编译过程 固定的三个命令 按顺序执行 lunch 根据自己需要选择不通平台
. build/envsetup.sh
lunch aosp_x86-eng
make -j16

在我编译过程中还遇到一个坑 如下:

merge_zips.go:752: prebuilts/gradle-plugin/com/android/tools/lint/lint-api/26.5.0/lint-api-26.5.0.jar: zip: not a valid zip file
12:05:58 ninja failed with: exit status 1

我查找prebuilts/gradle-plugin下面的文件,发现文件都是0kb,也就是这个文件夹中的文件根本没有同步下来,所以我直接删掉gradle-plugin这个文件夹,然后再一次执行repo sync,它会将gradle-plugin重新下载,接着编译就没问题了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注