最近因为一些原因需要用到安卓15的源玛,于是编译了以下安卓15的Aosp。
之前我写过一篇博客: ubuntu编译android12源码
这里的编译流程差不多,但是编译安卓15比编译安卓12坑会多一点,这里会一一带你解决。
这里我使用的的系统是ubuntu24.04.4版本。
这里我使用的ubuntu系统是双系统,不是虚拟机,内存32GB。
后之后觉,现在看来32G的内存还是不够,有条件的伙伴们还是建议到64G哦,不过最近的内存价格堪比黄金, 要想升级内存的话还是很肉疼啊。。。
这里安卓源玛的分支android-15.0.0_r23。
首先我们需要安装一些依赖:
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
然后再安装一个python-is-python3包。
sudo apt-get install python-is-python3
python-is-python3包的作用:它通常是一个虚拟包或者是一个提供符号链接的包, 使得系统中的“python”命令指向Python 3而不是Python 2。 在许多现代Linux发行版中,Python 2已被弃用,但一些脚本或程序仍可能调用“python”, 而这个包确保调用python会使用Python 3
环境安装好了之后,我们就可以下载源玛了, 众所周知,安卓源玛使用的是repo进行管理,这里就不多说了。
首先我们需要下载repo工具:
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod +x ~/bin/repo
上面下载repo我们使用到了清华的源,至于为什么呢?你别问,就算问了我也不知道。
然后将repo配置到你的环境变量中去,也就是将以下内容复制到你的~/.bashrc里保存即可:
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
PATH=~/bin:$PATH
最后别忘了source一下,使得更改的环境变量及时生效:
source ~/.bashrc
源玛管理攻击配置好了之后我们就可以下载安卓的源玛了。
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
mkdir aosp
cd aosp
#初始化仓库,-b 指示分支,这里使用 android-15.0.0_r23
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-15.0.0_r23
#同步远程代码
repo sync
-b 后面的参数可以参考官方文档: https://source.android.com/docs/setup/reference/build-numbers?hl=zh-cn#source-code-tags-and-builds
直接下载源玛可能会因为网络等问题而中断,这里我们使用一个脚本文件进行下载
#!/bin/bash
repo sync -j4
while [ $? -ne 0 ]
do
echo"======sync failed ,re-sync again======"
sleep 3
repo sync -j4
done
源玛下载好了之后我们就可以进行编译拉...
说实在的,每次遇到编译的问题都很头疼,问题总是奇奇怪怪的,虽然最终都会解决,但总要耗费很多时间,时间就是生命阿,大佬...
直接运行下面的命令即可,至于为啥?你不会问AI吗???
source build/envsetup.sh
lunch sdk_phone64_x86_64-trunk_staging-eng
# 这里用16线程,取决你的cpu
make -j16
编译的过程你是不太可能一把过的,除非你就是那个万中无一的练武奇才,天选之子...
开启编译后不久,我的第一个报错就来啦。。。

这就是典型的内存不足报错那,也就是我们常说的OOM,那么怎么知道这就是OOM报错呢?
我们可以使用以下命令看一下
sudo dmesg | tail -20
是否有OOM相关的日志。

其实这个解决方案也简单,也就是我们常说的增大内存缓冲区。
第一步,先关闭现有的交换区
sudo swapoff -a
这里以挂载到home目录下为例:
# 创建 32GB 的交换文件(如果空间不够,可以减小,如 16G)
sudo fallocate -l 32G /home/swapfile
# 如果 fallocate 不支持(例如某些文件系统),可以用 dd 替代:
# sudo dd if=/dev/zero of=/home/swapfile bs=1M count=32768 status=progress
设置权限:
sudo chmod 600 /home/swapfile
将 /home/swapfile 格式化为交换文件系统,也就是将其标记为可被内核用作交换空间:
sudo mkswap /home/swapfile
然后需要立即激活该交换文件,使其被内核正式用作交换空间
sudo swapon /home/swapfile
最后设置以下开机自动挂载,这是一个系统启动时自动挂载文件系统(包括交换空间)的配置文件。
sudo nano /etc/fstab
配置完成之后我们就可以继续编译了。
不出意外我的第二个报错就来了。

一看不对劲阿,刚开始编译怎么就报文件不存在了呢?
唯一的解析就是编译的时候因为某种原因导致写入失败了。
一般编译发生错误,我们都可以使用 dmesg | tail -30查看是什么原因导致的失败。
[ 7361.023798] systemd-journald[483]: Failed to open system journal: No space left on device
很明显空间不足了。
这是因为我在安装ubuntu系统的时候给根目录的分区空间太小了,才50个G,然后刚才修改交换区的时候挂载在了根根分区忘记删除了, 删除掉挂载在根目录的交换区即可。
修改完毕后再次启动编译。
然后第三个报错来啦。。。

报错的字面意思是说不能打开子进程。
这里我们依然可以用上面介绍的的命令查看为什么报错。
对于这个报错是因为在乌版图24.04上增加了对非特权用户命名空间的限制。
我们需要通过内核参数关闭 AppArmor 。
临时解决方案:(重启后失效)
# 检查当前值
sudo sysctl kernel.apparmor_restrict_unprivileged_userns
# 如果存在,临时设为 0 以允许
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
长期生效方案:建议使用,我也是使用的这种方案。
echo'kernel.apparmor_restrict_unprivileged_userns=0' | sudo tee /etc/sysctl.d/60-apparmor-namespace.conf
sudo sysctl -p /etc/sysctl.d/60-apparmor-namespace.conf
在解决完这三个问题之后笔者就编译成功啦。 然后使用emulator命令启动一下我们刚才编译成功的模拟器。

关注我,一起进步,人生不止coding!!!