joy keeps flowin'

Ubuntu编译AOSP

xx
目次

起因 #

网上有这么多相似的文章,还要再写这个的原因有两个:

  1. 纸上得来终觉浅。从去年就尝试按着网上的文章编译,总也不能通过,各种各样的问题;
  2. 记录一下过程,避免踩相同的坑,也好给其他的朋友一点参考。

准备 #

环境 #

先后尝试过用Windows、Mac编译,推荐直接用Linux,不管是不是Ubuntu。

Windows的好处是方便拓展,硬盘相对便宜,日常使用我相信不是Mac就是Windows了,Windows的装机量绝对是最多的。因此开始打算在Windows上编译。为了能在Windows上用shell命令,装了一堆东西,各种方案都试过,最后还是无果费了一顿劲。

Mac的是类Unix,有现成的shell可以用,电脑配置Macbook Pro 14’ 16G内存+512G硬盘。结论是硬盘不够😅。

用Windows还是Mac都是为了偷点懒,为了省这一小点的时间,反而浪费了更多时间,得不偿失。

因此,我建议直接Linux开干。

如果你有Windows,我建议装个虚拟机,Vmware Workstation Pro对个人都免费了,Linux镜像也是一搜一大把。(直接Google搜索,害怕百度粘上脏东西)。

装备 #

硬件:PC电脑 系统:Window 10 内存:32G 硬盘:2T 虚拟机软件:VMware Workstation Pro Linux:Ubuntu 22-04.5

我会把用到的软件和镜像上传到Google Drive,省去大家自己找的功夫,不放心也可以去官方找,都是免费的。只有VMware下载稍麻烦些。

Linux用你习惯即可。

我编译的是AOSP 13 r44的版本,建议为虚拟机分配硬盘时分配400G硬盘空间,开始分配300G同步代码完成后磁盘满了,很尴尬。

编译环境 #

创建虚拟机相信聪明的你可以搞定。创建后开搞。

JDK #

1
2
# 安装jdk
sudo apt install openjdk-11-jdk

Python3 #

Ubuntu 自 16.04 版本已经默认预装 python3,repo同步时用的命令都是python

1
2
# 通过软链接将python命令默认指向python3
sudo ln -s /usr/bin/python3 /usr/bin/python

安装依赖工具和库 #

1
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

配置git信息 #

1
2
3
4
# 配置Git的用户名
git config --global user.name "Your Name"
# 配置邮箱
git config --global user.email [email protected]

安装Repo #

Repo 是 Google 专门用来管理 Android 大型源码库的一个工具,比如 AOSP 项目。 简单说就是一个封装了 Git 命令的 python 脚本,用以简化跨多个 Git 仓库的代码管理和同步。通过 Repo,你可以在一个命令行中对所有仓库进行同步、检出特定的分支、以及执行其他 Git 操作。

1
2
3
4
5
# 安装repo
sudo apt install repo

# 查看repo版本(是否安装成功)
repo version

编译 #

创建AOSP文件夹 #

通过repo拉取。先创建一个文件夹。

以我的情况为例,我希望把文件夹命名清楚,以免过段时间字再想看时忘了是哪个版本了。

1
2
3
4
5
# 创建文件夹
mkdir AOSP_13_r44

# 进入AOSP_13_r44
cd AOSP_13_r44

初始化repo #

1
2
3
4
5
# 从Google下载Android13源码
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r44

# 从镜像站下载android-13.0.0_r44源码
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r44

虽然VPN是程序员必备的工具,但不一定有那么多流量,有那么多流量也不一定速度快,速度快也不一定稳定,建议从镜像站下载。

我用的清华的源(和上面相同),你也可以用中科大的,可以看下高爷的文章

这里说的是后面同步代码的,repo初始化时你需要打开VPN,让repo顺利完成初始化工作。

拉取代码 #

拉取时我劝你关掉VPN,流量直接走直连是最稳定的。开始时我设置路由器上的openclash模式为TUN,总是TLS握手失败,重试了好多次都还是不行。直连从来没有失败过。

1
2
3
4
5
# 默认命令
repo sync

# 只拉取当前分支
repo sync -c

只拉取当前分支会快一些,核心的代码改动很小,拉一个分支就足够了。

命令解释: -c current branch –no-tags 不拉取tags(默认) -j 并行job数量,默认是0,根据CPU核心线程决定

更多命令敲repo sync --h查看。

同步开始后是漫长的等待直到提示repo sync has finished successfully.就算完成了。

开始编译 #

初始化环境 #

1
2
# 执行该命令,envsetup.sh 脚本初始化环境
source build/envsetup.sh

此脚本会导入若干命令(包括本页中使用的命令),让您能够使用 Android 源代码。如果虚拟机关机了,需要重新执行一次。

选择构建目标 #

使用 lunch 命令选择要构建的目标

1
2
# 默认,从后续列表中选择构建目标,
lunch

你也可以选择你要构建的目标,直接输入。比如:

1
lunch aosp_cf_x86_64_phone-trunk_staging-userdebug

构建目标中的每个字段代表什么含义推荐参考官方文档,内容很全面。

构建代码 #

选择好构建的目标之后,开始执行。

1
m

您应看到的第一个输出是目标和构建环境的概要:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
============================================
PLATFORM_VERSION_CODENAME=VanillaIceCream
PLATFORM_VERSION=VanillaIceCream
PRODUCT_INCLUDE_TAGS=com.android.mainline
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=generic
HOST_OS=linux
HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
HOST_CROSS_OS=windows
BUILD_ID=AOSP.MAIN
OUT_DIR=out
============================================

设置swap #

如果编译过程中没有问题,等待完成即可。我给虚拟机的内容是16G,中间失败了一次。

报错信息:

1
soong bootstrap failed with: exit status 1

搜索后是因为内容不够,swap又小。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
I found the following video very interesting and a straightforward approach to increase the size of swapfile. Checkout this short video tutorial: How to Increase Swap on Ubuntu Linux | Linux Handbook

(From this video) following is the way to increase the swap space (if your system is using swapfile):

First check the swap size of your linux system:

swapon --show
Sample output:

NAME      TYPE   SIZE USED PRIO
/swapfile file 797.2M   0B   -2
This output shows the swap size is being used and the type of swap. Here the swap type is "file" type (it could be partition type as well).Ubuntu uses swapfile by default and increasing and decreasing the size of it is fairly easy.

As we are going to modify the swapfile so at first turn it OFF. You might notice the process is being killed for multiple times. This happens because before turning the swap OFF the system moves its contents to main memory which may overflow the main memory. So, if the following command is killed, run it multiple times until it is successfully completed. You may also face sudden logout and / or other processes may be killed automatically.:

sudo swapoff /swapfile
Now if you run swapon --show it won't show anything as it is turned OFF.

Now change the swap size (I am making it 4GB, for n GB make it nG):

sudo fallocate -l 4G /swapfile
Now if you check the file you will see the size is increased. To see it:

ls -lh /swapfile
Now tell the Linux system to use this file as swap system:

sudo mkswap /swapfile
This will wipe the old swap signature and use the new one.

Now to turn the swap ON (as we initially turned OFF the swap space):

sudo swapon /swapfile
Done!

Now use swapon --show or free -h to see the change.

来自How to increase swap space?

我分配的16G😂。

打开 #

不出意外等编译完成后,用Android Studio for platfom打开,打开时输入构建target和希望打开的模块,大部分代码都在framework里。

参考 #

Ubuntu 下编译 AOSP 源码

Android 系统开发系列(1):Android 12 源代码下载、编译和刷机

How to increase swap space?

标签:
Categories: