本文将介绍从零搭建AOSP(Android Open Source Project)编译环境,并编译最新的android-14.0.0_r50分支生成ROM刷入Pixel 6设备的过程,便于我们学习研究Android Framework层源码。
1.环境搭建
这里我使用一台PC来安装最新的Unbuntu 24.04版本作为编译环境。
1.环境基础要求
PC配置最相关的就是硬盘和内存(当然CPU也很重要):
- 硬盘:500G固态硬盘作为系统盘,外接一块1T固态硬盘用于放AOSP源码及其编译产物,实际测试建议至少预留500G
- 内存:32G内存,至少16G。内存越大越好,实际测试32G内存偶现编译卡住退出登陆的情况,最终通过增大交换空间来避免
2.Ubuntu系统安装&配置
因为我PC原本是Windows系统,偶尔还会用到,所以装了双系统。
对于Ubuntu 24.04版本的安装,这里直接推荐一个视频,一看就会!8分钟真机安装【Ubuntu/Windows】双系统,不再赘述。
也可以参照这篇官方文章Install Ubuntu desktop进行安装。
因为都是图形化操作,除了格式化磁盘需要注意一下,其他只需要点击下一步即可完成。
对于配置,外接硬盘一般是直接插入即可自动挂载,但不能使用NTFS格式,需要格式化为Ext4格式。
其他软件的安装可以直接去官网下载对应的安装包使用命令sudo dpkg -i xxx.deb
,部分软件包可以使用sudo apt install xxx
。但下面的软件对于源码编译都不是必须的,可以选择性安装。
- 输入法:建议先试用系统自带,搜狗输入法Linux版本还未适配24.04版本,安装使用会有一些莫名其妙的问题。
- VSCode
- Chrome
源码编译相关的软件系统都是自带的,无需额外安装。
3.设置交换空间大小
由于编译非常耗费内存,内存不够可能会导致编译失败,在物理内存不够的情况下我们可以设置交换空间将一部分磁盘空间作为内存的临时使用区域。
具体设置可以参考这篇文章在Ubuntu上增加swap交换空间。我设置了共30G交换空间,实际在编译时,大概会占用31G物理内存,12G交换空间。
2.下载AOSP源码
因为AOSP android-14.0.0_r50分支源码非常大(大约有240G),实际直接按照官方文档下载会非常慢容易失败,可以使用国内清华镜像源下载。
具体可以参考清华Android 镜像使用帮助这篇文章,可以先下载其每月更新的初始化包,然后再使用repo更新代码。
具体步骤如下:
1.安装repo
repo是一个在Git之上构建的工具,可以帮助我们管理很多Git仓库(例如AOSP或者OpenHarmony的源码就是由很多仓库组成的),我们后面使用其同步AOSP的代码。
mkdir ~/bin
PATH=~/bin:$PATH
cd ~/bin
# 这里使用清华的repo镜像源安装
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod a+x repo
2.下载AOSP初始化包并同步代码
这一步需要预留差不多500G左右的硬盘空间(实际代码240G左右,还有编译产物需要预留空间)
你可以通过查看这个链接(一定要注意看英文,中文文档内容不够新)Source code tags and builds查看所有的代码tag,结合你手里的设备找到合适的分支。
我选择下面的分支:
注意这里的第一列的【AP2A】,这个在后面编译ROM时会用到。
curl -OC - https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
# 解压得到的 AOSP 工程目录
tar xf aosp-latest.tar
# 这一步内部只有一个隐藏的.repo目录
cd aosp
# 初始化一个新的 repo 工作区,并设置默认的分支为 android-14.0.0_r50
repo init -b android-14.0.0_r50
# 同步所有项目到指定的分支
repo start android-14.0.0_r50 --all
# 从远程仓库同步代码到本地
repo sync
在最后repo sync
时可能会失败,可以多尝试几次。
这样我们就获得了特定分支的AOSP源码。
3.编译AOSP源码
1.下载设备驱动文件
因为我们最终编译出的ROM需要刷入Pixel6真机,所以我们需要在编译前在aosp目录下放置好相关的驱动文件。可以在这个链接Driver Binaries for Nexus and Pixel Devices查询到我们的设备对应的驱动文件。
有些设备是1个文件,有些设备是2个文件,我使用的Pixel6设备是一个文件,解压后是一个.sh
文件,我们将其拷贝到aosp目录下,执行如下命令:
bash extract-google_devices-oriole.sh
然后我们按空格进行翻页,最终需要我们在命令行输入I ACCEPT
来表示接受协议就会在aosp目录下生成一个vendor文件夹,其中是相关的驱动文件。
2.设置文件软连接
因为Ubuntu 24.04系统比较新,AOSP源码编译过程中有一些依赖的文件会出现找不到的情况,可以按照下面的方式设置,使用一个旧的文件名指向新文件即可。可以执行下面的命令:
cd /lib/x86_64-linux-gnu
sudo ln -s /lib/x86_64-linux-gnu/libncurses.so.6 libncurses.so.5
sudo ln -s /lib/x86_64-linux-gnu/libtinfo.so.6 libtinfo.so.5
3.设置目标设备&编译
我们需要先在aosp目录下执行如下命令初始化环境变量
source build/envsetup.sh
然后需要执行lunch <product_name>-<release>-<build_variant>
这个命令设置我们编译的目标设备。具体可以查看官方文档Choose a target
我们对上面3个参数进行介绍:
- product_name:以aosp开头,根据你的设备代号来拼接,可以在这里Device codenames查询到你的设备对应的代号。我的pixel6代号为oriole,则最终名字为
aosp_oriole
- release:这个跟代码分支相关,我们在前面选择代码分支时提到的一个build ID中就是此处的值。具体可以在Source code tags and builds查看,我的分支对应的为
ap2a
- build_variant:这个之的是构建变体,我们根据官方文档的说明选择即可,我选择了
eng
,这个版本允许我们可以进行Framework层源码调试
最终我的设备设定的命令如下:
lunch aosp_oriole-ap2a-eng
设定完成后我们就可以开始编译了,我们只需要在命令行输入m
回车即可。编译的时长根据我们的设备性能决定,二次编译也会快很多。
最终编译完的产物在aosp目录下的out文件夹中。
4.Pixel设备刷入ROM
1.设备解锁bootloader
在我们刷入ROM之前,我们还需要对设备解锁bootloader。Pixel设备的解锁非常方便,我们可以参考官方文档Unlock the bootloader进行。在打开开发者选项连接上设备的基础上,我们需要在开发者选中中找到OEM解锁
这个选项并打开,然后执行如下命令:
# 重启到fastboot模式
adb reboot bootloader
# 解锁bootloader
fastboot flashing unlock
然后我们需要通过电源键和音量键确认解锁即可,然后重启设备。
2.刷入ROM
最终编译完成的刷机的ROM,在aosp/out/target/product/oriole
这个目录下。
刷入ROM也非常简单,我们只需要在ROM目录下执行如下命令即可。
# 重启到fastboot模式
adb reboot bootloader
# 刷入ROM
fastboot flashall -w
等待设备自动重启开机后,就可以看到我们编译的ROM了。但由于我们刷的是工程版本,所以实际使用起来会有一些卡。
5.总结
以上就是整个从环境配置到源码下载编译最终刷入的过程了。文中的链接也很重要,对于一些已经非常成熟的流程选择了直接引用,可以在遇到问题时方便大家参考查阅。由于选用的Ubuntu系统很新,实际编译过程中可能遇到的一些问题遗漏没有整理出来,欢迎评论一起交流。