目 录

前 言

编译问题记录

内核编译

Android 编译

总结


前 言

        本文以编译全志 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 系统前,务必先确认是否满足官方硬件要求,以及安装编译所依赖的库。

Logo

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

更多推荐