前言

做Android应用好多年,一直对AOSP无所知,都不知道什么东西,目前车载那么火,就想介入进去,开始尝试去编译一下系统源码,然后去看了一下Android官网,目前最新的版本还不支持mac和window,只支持ubuntu,去整了个硬盘准备刷个系统,可能是Macmini原因,一直没能成功,很尴尬,最后整了虚拟机。

整个过程挺麻烦的,我下载是Android13最新的源码,因为源码需要,我用清华的镜像,下载倒是挺快,没有像别人说的两三天,但也有半天,编译也用了半天,过程有很多很多坑,记录下来给大家分享一下,一起学习。

一、构建环境搭建

1.1、准备工作

VMWare:https://www.vmware.com/products/fusion/fusion-evaluation.html Ubuntu镜像:http://mirrors.aliyun.com/ubuntu-releases/

1.2、VMWare安装Ubuntu

1.2.1、我的电脑是Mac,所以下载的是VMWare Fusion虚拟机,Android官网建议ubuntu版本选择18.0.4,给的内存大小尽量给大一些,我是16G,给了12G,磁盘大小给了500G

Ubuntu编译Android13系统源码,你会了吗?_git

1.2.2、如果是Mac的话,给了一个新的硬盘,格式化的话选择区分大小写,不然Androidstudo去跑源码会莫名的报错

Ubuntu编译Android13系统源码,你会了吗?_运维_02

1.3、下载git与Python3

1.3.1、git安装与下载

安装git:

<code class="language-plain has-numbering hljs" id="code_id_0">sudo apt install git</code>
  • 1.

安装依赖工具:

<code class="language-plain has-numbering hljs" id="code_id_1">sudo apt install git-core libssl-dev  libffi-dev gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev libz-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip</code>
  • 1.

设置git身份,添加自己的邮箱和姓名:

<code class="language-plain has-numbering hljs" id="code_id_2">git config --global user.email "zhangxiaoxiao@qq.com"
git config --global user.name "zhangxiaoxiao"</code>
  • 1.
  • 2.
1.3.2、Python3的安装与切换

下载Python3:

<code class="language-plain has-numbering hljs" id="code_id_3">sudo apt install python3</code>
  • 1.

配置update-alternatives,用于切换当前使用的python版本,需要设置软链:

<code class="language-plain has-numbering hljs" id="code_id_4">sudo update-alternatives --install  /usr/bin/python python /usr/bin/python2.7(python2安装地址)  2(权重号)
sudo update-alternatives --install  /usr/bin/python python /usr/bin/python3.7(python3的安装地址)  3(权重号)</code>
  • 1.
  • 2.

切换Python版本:

<code class="language-plain has-numbering hljs" id="code_id_5">sudo update-alternatives --config python</code>
  • 1.

Ubuntu编译Android13系统源码,你会了吗?_linux_03

二、源码下载与编译

AOSP(Android Open Source Project)是Google开放的Android 开源项目,中文官网为:source.android.google.cn/ AOSP通俗来讲就是一个Android系统源码项目,通过它可以定制 Android 操作系统,国内手机厂商都是在此基础上开发的定制系统。因为要墙,如果无法连接Google服务器获取AOSP源码,可以从 清华大学镜像站或者 中科大镜像。我用的是中科的例子

2.1、下载 repo 工具

创建bin,并加入到PATH中:

<code class="language-plain has-numbering hljs" id="code_id_6">mkdir ~/bin
PATH=~/bin:$PATH</code>
  • 1.
  • 2.

安装curl库:

<code class="language-plain has-numbering hljs" id="code_id_7">sudo apt-get install curl</code>
  • 1.

下载repo并设置权限

<code class="language-plain has-numbering hljs" id="code_id_8">curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo</code>
  • 1.
  • 2.
  • 3.
  • 4.

2.2、下载源码

然后建立一个工作目录(名字任意)

<code class="language-plain has-numbering hljs" id="code_id_9">mkdir aosp
cd aosp</code>
  • 1.
  • 2.

初始化仓库:

<code class="language-plain has-numbering hljs" id="code_id_10">repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'</code>
  • 1.
  • 2.
  • 3.

Ubuntu编译Android13系统源码,你会了吗?_ubuntu_04

如果需要某个特定的 Android 版本(Android 版本列表 ):

<code class="language-plain has-numbering hljs" id="code_id_11">repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24</code>
  • 1.

同步源码树(以后只需执行这条命令来同步):

<code class="language-plain has-numbering hljs" id="code_id_12">repo sync</code>
  • 1.

等待漫长的好几个小时,终于完成,成功会有这样提示

Ubuntu编译Android13系统源码,你会了吗?_python_05

2.3、安装构建环境

安装 jdk8

<code class="language-plain has-numbering hljs" id="code_id_13">sudo apt-get update
sudo apt-get install openjdk-8-jdk</code>
  • 1.
  • 2.

安装依赖:

<code class="language-plain has-numbering hljs" id="code_id_14">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</code>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

安装 sudo apt-get install libesd0-dev 会报 Unable to locate package libesd0-dev 这个错,解决办法

<code class="language-plain has-numbering hljs" id="code_id_15">sudo gedit /etc/apt/sources.list  //在行尾添加如下两行的内容
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe</code>
  • 1.
  • 2.
  • 3.

Ubuntu编译Android13系统源码,你会了吗?_git_06

2.4、编译

使用envsetup.sh脚本初始化环境:

<code class="language-plain has-numbering hljs" id="code_id_16">source build/envsetup.sh</code>
  • 1.

选择用lunch构建哪个目标,根据设备选择需要的目标,该设备可以是google官方提供的,根据google提供的驱动地址下载:developers.google.cn/android/dri…或者可以用电脑模拟器“sdk_phone_x86_64”,我这边没有设备使用的是电脑模拟器

<code class="language-plain has-numbering hljs" id="code_id_17">lunch sdk_phone_x86_64</code>
  • 1.

构建代码

<code class="language-plain has-numbering hljs" id="code_id_18">m j8(8等于核数*2</code>
  • 1.

其他指令说明

<code class="language-plain has-numbering hljs" id="code_id_19">- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
- clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同
其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Setting 模块,执行指令:
mmm packages/apps/Settings/</code>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

Ubuntu编译Android13系统源码,你会了吗?_linux_07

启动模拟器

<code class="language-plain has-numbering hljs" id="code_id_20">emulator</code>
  • 1.

Ubuntu编译Android13系统源码,你会了吗?_python_08

模拟器关闭时候,其实在后台还存在,需要自行关闭

<code class="language-plain has-numbering hljs" id="code_id_21">pkill qemu</code>
  • 1.

三、自定义ROM真机刷机

USB 调试配置:(设备USB能连上电脑虚拟机则不用管,如果不是用虚拟机能连上电脑也忽略)developer.android.google.cn/studio/run/…

驱动下载:developers.google.cn/android/drivers#angleropr6.170623.019

Ubuntu编译Android13系统源码,你会了吗?_python_09

下载完对应的驱动,并将压缩包放入已经下载好的源码根目录,解压后得到两个脚本文件,从源代码树的根目录运行附带的自解压脚本,然后确认您同意附带的许可协议的条款。二进制文件及其对应的 makefile 将会安装在源代码树的 vendor/ 层次结构中

<code class="language-plain has-numbering hljs" id="code_id_22"># 我的目录/home/zhangxiaoxiao/aosp
extract-qcom-barbet.sh
extract-google_devices-barbet.sh</code>
  • 1.
  • 2.
  • 3.

Ubuntu编译Android13系统源码,你会了吗?_git_10

为了确保新安装的二进制文件在解压后能被有效采用,请使用以下命令删除所有之前 build 的已有输出:

<code class="language-plain has-numbering hljs" id="code_id_23">make clobber</code>
  • 1.

进入Bootloader模式:(解BL锁)

<code class="language-plain has-numbering hljs" id="code_id_24">adb reboot bootloader</code>
  • 1.

查看连接设备:

<code class="language-plain has-numbering hljs" id="code_id_25">fastboot devices</code>
  • 1.

刷机:

<code class="language-plain has-numbering hljs" id="code_id_26">fastboot flashall -w</code>
  • 1.

四、过程报错收集

无法安装libesd0-dev

<code class="language-plain has-numbering hljs" id="code_id_27">解决办法:
sudo vim /etc/apt/sources.list  //在行尾添加如下两行的内容

deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe

更新软件源并重新安装:
sudo apt-get update && sudo apt-get install libesd0-dev</code>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

内存不够,新版本要求16G,可能是你开的线程太多了。比如make -j8 这种。还有一种原因是可能没有设置swap交换区,就是把磁盘空间当作临时内存,注意的点是,设置完成需要重启虚拟机或电脑。

<code class="language-plain has-numbering hljs" id="code_id_28">//查看内存大小
free -m
//创建交换分区的文件:增加16G大小的交换分区,则命令写法如下,其中的 count 等于想要的块大小
dd if=/dev/zero of=/home/swapfile bs=1M count=16384
//设置交换分区文件,建立swap的文件系统
mkswap /home/swapfile
//立即启用交换分区文件
swapon /home/swapfile

//如果要使系统开机时自启用,要在文件/etc/fstab中添加一行
/home/swapfile swap swap defaults 0 0</code>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

KVM的虚拟化需要硬件支持报错

<code class="language-plain has-numbering hljs" id="code_id_29">//报错信息
INFO    | Android emulator version 31.3.9.0 (build_id 9070145) (CL:N/A)
INFO    | Storing crashdata in: /tmp/android-zhangxiaoxiao/emu-crash.db, detection is enabled
INFO    | Duplicate loglines will be removed, if you wish to see each indiviudal line launch with the -log-nofilter flag.
ERROR   | x86_64 emulation currently requires hardware acceleration!
CPU acceleration status: KVM requires a CPU that supports vmx or svm

//安装kvm解决办法参考如下
https://help.ubuntu.com/community/KVM/Installation
//模拟器参考</code>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

make完不能直接emulator启动电脑模拟器,会报错,lunch aosp_x86-eng这个版本不行,Android12改掉了会报错

<code class="language-plain has-numbering hljs" id="code_id_30">ERROR   | Failed to create Vulkan instance.
qemu-system-x86_64: Could not open '/home/zhangxiaoxiao/aosp/out/target/product/generic_x86_64/userdata-qemu.img': No such file or directory

//解决办法
lunch sdk_phone_x86_64</code>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

感谢

 www.jianshu.com/p/6dee223ac…

 www.jianshu.com/p/53941de91…

 www.pudn.com/news/62599c