全志 T527_Android13 编译 [ 避坑必看 ]
目 录
前 言
本文以编译全志 T527_Android 13 为例,记录我在编译时遇到的一些错误以及解决方案。希望可以给准备编译Android 13 的工程师们提前避避坑,可以节约不少时间。
更多文章欢迎您关注公众号”嵌入式分享“,后面就只在公众号发表文章啦。
编译问题记录
具体编译命令以及步骤可参考:https://docs.avaota.fun/android/build/build。
这里我只记录编译时遇到的问题以及最后的解决方案。
Android 13 系统的编译流程,编译一共分为两部分:内核编译与 Android 编译。
内核编译
内核编译时遇到两个问题,记录如下:
(1)编译缺少依赖库 libelf‑dev 。
通过安装sudo apt-get install libelf-dev 该库解决,编译报错如下:
HDRINST usr/include/drm/qxl_drm.h
libbpf.c:47:10: fatal error: 'libelf.h' file not found
#include <libelf.h>
^~~~~~~~~~
HDRINST usr/include/drm/omap_drm.h
(2)虚拟机内存太小(4G)
报错如下:
BTFIDS vmlinux
FAILED: load BTF from vmlinux: Invalid argument
/home/t527/Android13/longan/kernel/linux-5.15/Makefile:1292: recipe for target 'vmlinux' failed
make[1]: *** [vmlinux] Error 255
make[1]: *** Deleting file 'vmlinux'
make[1]: Leaving directory '/home/talowe/t527/Android13/longan/out/t527/kernel/build'
Makefile:244: recipe for target '__sub-make' failed
make: *** [__sub-make] Error 2
ERROR: build Failed
INFO: build kernel failed
解决方案:
将虚拟机的 4G 内存改成 8G 后(如下图),内核成功编译通过。

Android 编译
编译 android 系统时遇到内存不足导致编译中断,进而编译失败。报错如下:
[100% 410/410] analyzing Android.bp files and generating ninja file at out/soong/build.ninja
FAILED: out/soong/build.ninja
cd "$(dirname "out/host/linux-x86/bin/soong_build")" && BUILDER="$PWD/$(basename "out/host/linux-x86/bin/soong_build")" && cd / && env -i "$BUILDER" --top "$TOP" --soong_out "out/soong" --out "out" -o out/soong/build.ninja --globListDir build --globFile out/soong/globs-build.ninja -t -l out/.module_paths/Android.bp.list --available_env out/soong/soong.environment.available --used_env out/soong/soong.environment.used.build Android.bp
codec2-config: sdkVersion[33]
use aw hw vp9!
codec2-config: media afbc mode :[2]
cedarx-config: sdkVersion[33], board[saturn], platformconfig[YES]
cedarx-config: media afbc mode: [2]
registry_table has NOT been set. Please check it.
cedarc-config: sdkVersion[33], board[saturn], platformconfig[YES], cryptolevel[3], playreadytype[]
registry_table has NOT been set. Please check it.
awcamera.go : sdkVersion: 33
awrecorder.go : sdkVersion: 33
08:46:58 soong bootstrap failed with: exit status 1
#### failed to build some targets (02:01 (mm:ss)) ####
#### failed to build some targets (02:01 (mm:ss)) ####
解决方案
(1)减少编译线程
当输入编译命令make -j16 的时候,会有如下提示,这是官方建议通过减少编译线程来解决编译时消耗内存过大的问题。我尝试直接改为make -j2 编译,但依然编译失败。减少编译线程,哪怕能正常编译,它也不是解决内存问题的最优解。因为减少编译线程会导致编译非常缓慢,这不是我们想要的结果。于是,果断放弃这种解决方案。

(2)增加swap 内存
Swap 概念: Linux中Swap(即:交换分区),类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。交换分区,英文的说法是swap,意思是“交换”。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行。
我这里是使用 Ubuntu 编译 android 系统,因此增加的是 Ubuntu 的 swap 内存分区。具体操作步骤如下:
- 检查 /swapfile 是否已激活
sudo swapon --show
(如果 /swapfile 出现在输出中,表示它已经被激活。)
- 禁用当前的交换文件
sudo swapoff /swapfile
- 重命名现有的 /swapfile
sudo mv /swapfile /swapfile.old
- 重新创建交换文件
sudo dd if=/dev/zero of=/swapfile bs=1M count=20480
(注:编译 android 源码总耗内存小于40G,本机内存约 32, 这里分配20G为足矣)
- 设置交换文件权限
sudo chmod 600 /swapfile
- 将文件设置为交换空间
sudo mkswap /swapfile
- 激活交换文件
sudo swapon /swapfile
- 验证交换文件是否已成功激活
sudo swapon --show
另外,如果你希望在系统重启后自动启用此交换文件,可以将其添加到 /etc/fstab 文件中。
在文件的末尾添加:/swapfile none swap sw 0 0
总结
在编译Android 13 系统前,务必先确认是否满足官方硬件要求,以及安装编译所依赖的库。

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)