一、环境描述
电脑配置:
- 系统:Windows10
- 内存:16GB
- 硬盘:500GB
软件环境:
- VirtualBox虚拟机
- 虚拟配置:
- 系统:Ubuntu16.04.7
- 内存:9GB
- 硬盘:300GB (编译完大概占用180GB)
二、 虚拟机安装与配置
2.1 虚拟机Ubuntu安装
虚拟机镜像选择,我使用的是ubuntu-16.04.7-server-amd64,这是服务器的镜像,没有Ubuntu桌面,相比ubuntu桌面版更为轻量。
安装细节,请参考安装教程参考:《virtualbox下安装ubuntu server 16.04》
在安装过程中,有一个步骤是勾选系统所带的服务。我们要选择ssh server,这样我们就不必再手动安装了。因为ssh服务开启之后,我们可以通过终端工具,轻松的控制虚拟机,而不必再虚拟机和宿主机之间频繁切换
2.2 系统配置与软件安装
2.2.1 设置root用户密码
root用户在Linux系统下,有着绝对权限。它就是Windows系统上的Adminstrator。如果系统是首次完成安装,则要设置一个密码,便于进入root用户下进行软件按着和设置管理。设置方式很简单,执行如下命令:
su passwd
接下来连续两次输入你想要的设置的密码,通过“Enter”键结束输入
如果以后想切换到root用户下,先键入su命令,回车,输入密码,再回车。
2.2.2 安装vim
vim 是linux系统上毫无疑问的位于Number One的文本编辑器:
sudo apt-get install vim
等待安装成功
2.2.2 修改apt源
当我们执行apt-get install 来安装某个软件,其本质上是去网上的某个位置下载软件,并进行安装。而这个网络中存储软件的地方就是“apt 源”。这种Ubunt进行源有很多:比如 清华大学、东北大学、阿里云、腾讯。我使用的是阿里云源。
# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
直接将该内容存入到/etc/apt/source.list目录下。(强烈建议在修改之前,先拷贝一份,进行备份).最后执行apt update 更新apt 镜像源。
//备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
//编译
sudo vim /etc/apt/sources.list
//更新apt
sudo apt-get update
具体修改可参考《Ubuntu16.04 几个国内更新源》。
最最后,说一句不同版本的ubuntu,apt源内容不一样,请自行百度适配。
小技巧:
当我们通过apt-get install 下载某个软件较慢时,想要通过Control + z 取消下载.当我们再想使用apt-get install下载内容时,会提示 “…lock” 即某个文件被锁住。那么该如何处理呢?
答案:哪里有lock,就删除哪里
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
2.2.3 修改dns
你可能会有疑问,为什么要修改dns。因为dns响应速度也会影响你软件安装的快慢。我是北京联通网络,我会优先选择一个北京联通的dns:123.123.1233.123,阿里云体验不错,它们的dns也比较好记:223.5.5.5 和 223.6.6.6.
通过ping dns地址你会发现(在我使用的是联通宽带的情况下)北京联通dns是5ms左右,而阿里云大概15ms左右。
接下来说一下在哪里改dns:
答案是:"/etc/resolvconf/resolv.conf.d/base"
sudo vim /etc/resolvconf/resolv.conf.d/base
# 新增如下内容
nameserver 123.123.123.123
nameserver 223.5.5.5
2.2.4 安装python
Ubuntu16.04.7 自带python版本为2.7和3.5。在通过repo下载源码时,总是报错“ error unknown url type: https”,原因是这两个python的都没有依赖https模块。 因为解决这个问题最好的方式就是:安装带有https模块的python , 那么怎么安装呢?方式有两种:
a. 去官网下载python 3.6及其以上的tgz包,解压缩,自行编译带有ssl模块与安装
b. apt-get install python3.7 (建议改方式)
安装完python3.7, 你会发现你的机器中python的版本多达三个,并且执行python命令,系统使用的是python2.7;执行python3,系统使用的是python3.5。这和新安装的python3.7没有任何关联。接下来我们要使用软连接,将python3.7关联到python和python3命令。
# 移除原有python软连接
$ sudo rm /usr/bin/python
# 更换默认python3 的版本为3.7
$ sudo ln -s /usr/bin/python3.7 /usr/bin/python
# 移除原有python3软连接
$ sudo rm /usr/bin/python3
# 更换默认python3 的版本为3.7
$ sudo ln -s /usr/bin/python3.6 /usr/bin/python3
2.2.5 安装git并进行配置
sudo apt-get install git
git config --global user.email "某个邮箱@163.com"
git config --global user.name "某个名称"
2.3 编译环境的安装
2.3.1 openjdk8 安装
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
2.3.2 软件安装
sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev
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
sudo apt-get install libssl-dev
对于这里要安装的原件,多多益善吧
2.3.3 软件安装
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
sudo apt-get install ccache
source ~/.bashrc
对于这里要安装的原件,多多益善吧
2.3.4 设置swap区
我安装完系统,swap区默认是900多MB。在编译源码过程中,到了90%时OOM。由于物理内存有限只有8GB。只能通过swap区 来避免编译时OOM。
设置swap的文章很多,直接传送门-《Ubuntu添加swap分区》了,哈哈。
三、 源码下载
3.1 下载 repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod +x repo
并将如下内容放入到~/.bashrc文件中
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
通过source使修改生效
source ~/.bashrc
3.2 下载android10源码
AOSP清华官网提供两种下载方式,我们选择比较传统的方式。
建立工作目录:
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r1
如果您想编译镜像给手机google原生手机用,那么久需要谨慎一点。因为这里有个规则。因为手机涉及到真是的驱动程序,需要先确定某个手机的驱动版本和android系统版本是否匹配。
先去查看系统与系统列表
再根据上图中,前面"QP1A.190711.019"去驱动列表下载对应的驱动,编译编译时使用。
接下来就是同步代码咯
repo sync
四、 源码编译
经过上述的操作,现在系统已经有了完整的编译环境
4.1 驱动解压缩
因为我们是要往真实手机Pixel上安装的。
如上图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本:
将两个脚本copy到源码所在目录[WORKING_DIRECTORY],并分别执行。得到vendor目录
4.2 编译
//1. 建立android-q开发分支:
repo start android_q --all
source build/envsetup.sh
lunch
输入lunch命令,等待提示 输入编译类型: 选择 sailfish***userdebug 对应的编号,我是16。
因为sailfish是 pixel机型的代号
编译,开启四个线程(如果你的机器好,可以看8线程)
make -j4
经过漫长的等待,7.5个小时,终于成功了
总共占用物理磁盘181GB
编译之后的输入镜像文件,其所在路径为"/out/target/product/sailfish"
输出的镜像文件:
五、 刷机
5.1 刷机基本操作
刷机教程参考文章,其核心步骤:
//1.进入fastboot模式
adb reboot bootloader
//2.下载新编译好的镜像(略)
//3. 确保adb环境(略)
//3.1 如果是windows平台,请参考5.2节,否则如下配置生产out的目录
export ANDROID_PRODUCT_OUT=/home/zhangbin/Aosp/out/target/product/sailfish
//4. 刷机
fastboot flashall -w
5.2 windows挂载 Ubuntu服务器
在进行刷机时,需要设置环境变量ANDROID_PRODUCT_OUT。 如果是windows 需要指向其编译机器下的镜像输出目录。要想实现共享,需要在Ubuntu Server上安装和配置samba服务器。
- samba服务器配置
- 在windows中,将服务器编译输出目录,映射为本地文件夹,编译访问
- 设置Windows环境变量
再 继续5.1节的刷机操作