再学安卓 - AOSP代码下载及编译

371 阅读7分钟

0.png

前言

AOSP是Android Open Source Project的简称。官方文档 7.png

不幸的是,如果你按照上面官方的操作文档实操,第一步下载源码就会卡住。国内用户想要下载AOSP源码需要从镜像网站上下载。而AOSP源头镜像则来自于清华大学。又不幸的是,可能大家对于AOSP的热情过于高涨,清华大学对镜像网站做了限流,尝试了一下,我所在的区域想要把AOSP全部拉下来几乎不可能。最终,中科大的镜像拯救了我。

8.png 可以看到,中科大的数据也是定期从清华大学同步过来的。同时中科大还提供了其他Linux开源发行版的源码镜像yyds。

即使有中科大的镜像,由于第一次同步数据量巨大,想要通过repo脚本直接同步也比较困难,因此我们需要先下载初始化包,解压之后相当于完成了第一次同步,再按照官网的步骤操作就畅通无阻了。当然,同步地址是需要更换成中科大镜像网站的。

这里可能有些啰嗦,但我认为对于不熟悉的伙伴,了解事情的来龙去脉才能明白为什么要这样做,更容易理解每一步操作有什么作用,而不是机械的重复,中间一旦出错不知道从何查起。

好了,了解了以上不幸中的万幸之后,我们开始实操。

注:实操内容难度较小,为了行文流畅,我将不会在正文中插入遇到的问题及解决方案,这些内容将统一放在文末的Q&A章节,欢迎查阅。若文末章节未能解决您的问题,请在评论区求助,广大网友的力量是无穷的。 😄

下载初始化包

从中科大给出的https链接下载tar包,并拷贝到WSL中解压。

# 1.解压tar包
tar –xvf aosp-latest.tar
# 进入解压出来的根目录,看不到任何文件,因为此时还没有执行sync操作,根目录中只有一个隐藏目录.repo
# 它包含了AOSP仓库的Git信息

# 2.进入aosp/.repo/manifests.git目录,修改config文件中的url地址
root@vincent-win11:~/aosp/.repo/manifests.git# vi config
[remote "origin"]
        # url = http://aosp.tuna.tsinghua.edu.cn/platform/manifest
        url = git://mirrors.ustc.edu.cn/aosp/platform/manifest
        # 也可以使用http协议:
        # http://mirrors.ustc.edu.cn/aosp/platform/manifest
        # https://mirrors.ustc.edu.cn/aosp/platform/manifest

同步分支

可以通过链接查看BuildID、分支标识、支持设备的列表,选取你希望同步的分支代码。这里我选择了以下分支,后续可能会收一个旧pixel手机实际刷机,这个分支支持很便宜的pixel5又是android14,符合我的需求。 3.png

# 1.由于后续会经常使用到repo脚本,因此给它配置一个环境变量
vi /etc/profile
# 在文件最后增加如下一行,repo脚本位置替换为您的repo路径
export PATH=/root/aosp/.repo/repo:$PATH

# 2.在manifests目录中执行命令查看分支名称
root@vincent-win11:~/aosp/.repo/manifests# git branch -a

# 3.回到aosp根目录,同步代码,且指定分支
cd ~/aosp
repo init -b android-14.0.0_r28
# 第一次执行repo init会提示输入用户名及邮箱等(用于git),照常输入即可。

# 4.启动同步
repo sync
# 同步完成之后会看到 repo sync has finished successfully.

注:sync命令默认4个并发连接,请不要使用-j增加连接数,大家细水长流,有福同享😀

下载驱动二进制文件(可选)

一部分硬件驱动由硬件厂商提供,Google并没有这些驱动的源码,因此自然也不会包含在AOSP的编译产物中。如果我们想要做出可以烧录到手机上的镜像文件,那么我们必须下载这些驱动,并放入AOSP编译目录中的vendor目录中,生成产物时将被包含进系统镜像中。

如果您只想玩一玩编译模拟器镜像,那么此步骤可以跳过。

通过上一步查询到的BuildID(UP1A.231105.001.B2),可以在这个页面中找到对应的二进制文件。

下载解压之后,您将得到sh脚本文件,将其放在aosp根目录下执行它。 4.png 5.png

执行编译

  1. aosp根目录执行脚本初始化编译所需的环境变量。
root@vincent-win11:~/aosp# source build/envsetup.sh
  1. 选择需要编译的类型(设备、版本类型)。lunch命令的参数详解请参见这里。如果你有Google手机,可以在这里找对应参数。比如:pixel5对应aosp_redfin-userdebug。由于当前我没有Google手机,所以选择了sdk_pc_x86_64-userdebug,后续我们将在Windows上运行我们编译的模拟器镜像。

注:新推出的模拟器CuttleFish支持通过浏览器远程访问,可以在ubuntu下启动CF模拟器,在windows端远程操作它。但由于网络传输可能会比较卡,且在WSL下要支持CF模拟器需要编译加载支持KVM的内核模块,并开启嵌套虚拟,所以我没有采用这种方案。感兴趣的伙伴可以参考这篇文章

root@vincent-win11:~/aosp# lunch sdk_pc_x86_64-userdebug
# 若不带参数,lunch命令将列出支持的所有类型。
  1. 启动构建。漫长的等待,我的机器配置编了2小时44分钟。
root@vincent-win11:~/aosp# m

极致简约的物理编译环境,强大的散热框架结构,保证生产过程,安全、可靠、高效😂 6.jpg

Q&A

以下均为实操过程中我遇到的问题,同样的问题表象可能根源不同,对应的解决方案也不同,因此下列解决方案仅供参考,欢迎在评论区留言讨论。

repo sync无法拉取源码,且无任何错误提示

此情况大概率是因为初始化包中包含的repo脚本已过时,其实.repo/repo目录是一个单独的git仓库,用来管理repo脚本的版本,因此我们直接更新这个repo仓库,再执行repo sync即可。

root@vincent-win11:~/aosp/.repo/repo# git status
On branch default
Your branch is behind 'origin/stable' by 40 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean

root@vincent-win11:~/aosp/.repo/repo# git pull
root@vincent-win11:~/aosp/.repo/repo# repo sync

启动构建后生成ninja文件报错

7.png 此情况大概率是swap或内存太小,导致生成失败。检查C:\Users<用户名>.wslconfig文件中的配置,确认以下配置项的大小是否合适。我就是因为这个原因,斥巨资买了一条32G内存,资本的力量果然强大,可以驱动编译😂

# 配置内存大小,一般为物理内存的50%,AOSP编译要求至少16GB,因此您的机器至少需要32G物理内存
memory=20GB
# 交换分区大小,一般为内存大小的2倍
swap=40GB

找不到共享库libncurses.so.5或libtinfo.so.5

8.png 9.png 执行以下命令安装缺少的库

sudo apt-get update
sudo apt-get install libncurses5-dev

10.png 安装后,您可能会发现依然提示找不到库。原因可能是我安装的Ubuntu默认该库的版本已经到6了,我猜测编译脚本写死了版本号,因此我们需要建一个软链接指向版本6的文件位置即可。

sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/libtinfo.so.5
sudo ln -s /usr/lib/x86_64-linux-gnu/libncursesw.so.6.3 /usr/lib/x86_64-linux-gnu/libncurses.so.5

参考

AOSP官方文档

中国科学技术大学AOSP镜像操作指南