RK3568 Android11编译环境搭建及报错解决指南

科创之家 2026-02-05 8632人围观

嵌入式开发领域,RK3568芯片凭借其出色的性能被广泛应用。基于RK3568进行Android11系统的开发,首先要搭建好编译环境。本文将详细介绍在Ubuntu20.04系统上搭建RK3568 Android11编译环境的过程,并针对常见的报错给出解决办法。

wKgZO2kal-mAe3kOAAE_KkNPTr4555.png

一、编译环境搭建步骤

(一)安装必要的依赖包

在开始搭建编译环境之前,需要确保系统安装了AOSP编译工具和相关依赖。打开终端,依次输入以下命令:

sudo apt-getupdatesudo apt-getinstall-y bison g++-multilib git gnupg flex libc6-dev-i386 lib32ncurses5-dev lib32z1 liblz4-tool openjdk-8-jdk python unzip x11-utils

这些命令会更新软件包列表,并安装编译所需的各种工具和库。其中,openjdk-8-jdk是编译Android系统所必需的Java开发工具包,因为Android系统的部分代码是基于Java语言编写的。而lib32ncurses5-dev32位库文件的安装,是由于一些编译工具在运行时可能会依赖32位的库环境。

(二)安装repo工具

repo工具是Android开源项目用来管理多个Git仓库的工具,在获取Android源码时必不可少。通过以下命令安装repo工具:

mkdir-p ~/bincurl > ~/bin/repochmoda+x ~/bin/repoexportPATH=~/bin:$PATH

上述命令首先创建了一个~/bin目录用于存放repo工具,接着通过curl命令下载repo工具脚本,并赋予其可执行权限,最后将~/bin目录添加到系统路径中,这样在任何目录下都可以直接使用repo命令。

(三)初始化和同步源代码

完成repo工具的安装后,就可以使用它来初始化和同步Android11的源代码。在终端中输入以下命令:

repoinit -u -b android-11.0.0_r8(举例)reposync

repo init命令用于初始化一个新的Android代码仓库,-u参数指定了代码仓库的URL-b参数指定了要同步的分支版本,这里选择的是Android11.0.0的第8个版本。repo sync命令则会根据初始化的配置,从远程仓库同步所有相关的代码到本地,这个过程可能会比较耗时,取决于网络状况和代码量的大小。

(四)构建系统

当源代码同步完成后,就可以开始构建系统了。在构建之前,需要先设置一些环境变量并选择编译目标。在终端中依次输入以下命令:

sourcebuild/envsetup.shlunch rk3568-userdebugmake -j$(nproc)

source build/envsetup.sh命令用于设置Android编译环境的相关变量,这些变量包含了编译所需的各种路径和配置信息。lunch命令用于选择编译目标,rk3568-userdebug表示针对RK3568芯片的用户调试版本。最后的make -j$(nproc)命令是正式开始编译系统,-j$(nproc)参数表示使用系统的所有可用核心数进行并行编译,以加快编译速度。

二、常见报错及解决办法

(一)找不到libncurses.so.5

在编译过程中,有时可能会遇到类似cannot open shared object file: No such file or directory关于找不到libncurses.so.5库的错误。这是因为编译过程依赖的libncurses库缺失或版本不匹配。

1.对于Ubuntu/Debian系统

sudo apt-getupdatesudo apt-getinstall libncurses5ls/usr/lib/libncurses.so.5

(二)module source path "xxx/.git" does not exist错误

在编译时,可能会出现类似于error: hardware/rockchip/librga/Android.bp1: module "gen_rga_version": module source path "hardware/rockchip/librga/.git" does not exist这样的错误。这通常是因为相关模块在配置中引用了.git目录,但实际该目录不存在。

解决办法是打开对应的Android.bp文件(如hardware/rockchip/librga/Android.bp),将文件中引用.git目录的部分删除。例如,在hardware/rockchip/librga/Android.bp文件中,找到类似如下的代码段:

genrule { name:"gen_rga_version", srcs: ( "version.h.template",- ".git/" ), out: ("version.h"), cmd:"rm -f$(location version.h)&& "+"bash$(location version.sh)$(in)>$(out)",}

.git/这一行删除,保存文件后重新编译即可。

(三)编译内核时找不到openssl/bio.h文件

首次编译内核时,可能会遇到找不到openssl/bio.h文件的错误,错误信息类似如下:

xxxxxx:~/source/rk3568/rk3568_android_11/kernel$ make ARCH=arm64 BOOT_IMG=boot_sample.img rk3568-evb1-ddr4-v10.img HOSTCC scripts/extract-certscripts/extract-cert.c25: fatal error: openssl/bio.h: 没有那个文件或目录compilation terminated.make(1): *** (scripts/extract-cert) 错误1make: *** (scripts) 错误2

这是因为系统缺少libssl-dev库。解决方法如下:

1.安装libssl-dev

在终端中输入命令sudo apt-get install libssl-dev尝试安装。但在Ubuntu20.04系统中,可能会出现软件冲突问题,如提示libssl-dev :依赖: libssl1.0.0 (= 1.0.2g-1ubuntu4)但是1.0.2g-1ubuntu4.20正要被安装

1.处理软件冲突

可以先尝试安装指定版本的libssl1.0.0,输入命令sudo apt-get install libssl1.0.0=1.0.2g-1ubuntu4。此时系统可能会提示将对libssl1.0.0进行降级操作,确认继续即可。

1.重新安装libssl-dev

安装完指定版本的libssl1.0.0后,再次输入命令sudo apt-get install libssl-dev进行安装。安装完成后,重新编译内核即可正常进行。

(四)编译过程中的链接错误

RK3568的编译过程中,还可能会遇到链接错误,这类错误通常与工具链配置、依赖库缺失、符号未定义或路径问题有关。

1.确认错误信息

常见的链接错误信息有:

undefined reference to...:表示未定义的符号(函数或变量),可能是源码缺失或依赖库未链接。例如,如果在编译过程中提示undefined reference to 'function_name',则需要检查是否有包含function_name函数定义的源文件未被正确编译或链接。

cannot find -lxxx:表示找不到指定的库文件(如-lrockchip)。比如提示cannot find -lrockchip,那就需要确认librockchip.so库文件是否存在,以及链接路径是否正确。

relocation truncated to fit:这通常是内存地址分配问题,常见于32/64位混合编译的情况。

1.检查交叉编译工具链

whichaarch64-linux-gnu-gcc
exportCROSS_COMPILE=aarch64-linux-gnu-exportARCH=arm64

RK3568ARM64架构,需要使用aarch64-linux-gnu-系列工具链。可以通过以下命令确认工具链是否已安装且路径正确:

如果输出类似/usr/bin/aarch64-linux-gnu-gcc,则说明工具链已安装且路径正确。如果未安装,需要从官方或可靠渠道下载并安装对应的交叉编译工具链。

在编译时,还需要指定工具链,通过以下命令设置环境变量:

1.检查依赖库

缺失库文件:确保所有依赖库(如librockchip.solibmali.so)已正确安装,且路径通过-L指定。例如,如果librockchip.so库文件安装在/usr/local/lib目录下,在编译命令中需要添加-L/usr/local/lib来指定库文件的搜索路径。

链接顺序问题:调整链接顺序,确保被依赖的库放在后面。例如,假设main库依赖sub库,那么链接库的顺序应该是-lsub -lmain,而不是-lmain -lsub

1.符号未定义(undefined reference

源码缺失:检查是否漏编译某些源码文件(.c/.cpp),或Makefile中未包含相关目标。比如在一个项目中,如果有一个function.c文件实现了某个功能,但在Makefile中没有将其添加到编译目标中,就会导致链接时找不到该函数的定义。

头文件与实现不匹配:确保头文件中的函数声明与实现一致,例如在C++中,如果头文件中函数声明使用了extern "C",那么对应的实现文件也需要使用extern "C",否则会导致链接错误。

静态库顺序:对于静态库,需要按依赖顺序排列,或用--start-group--end-group包裹。例如,如果有libfoo.alibbar.a两个静态库,且libfoo.a依赖libbar.a,那么链接命令可以写成-Wl,--start-group -lfoo -lbar -Wl,--end-group

1.SDK或内核编译问题

makerockchip_linux_defconfigmakeprepare modules_prepare

内核配置:若编译内核模块,需先编译内核头文件,并确保模块与内核版本一致。可以通过以下命令进行内核配置和准备:

设备树未编译:确认设备树文件(.dts)已编译为.dtb,并放置在正确路径。设备树文件描述了硬件设备的信息,如果设备树未正确编译或放置位置错误,可能会导致编译错误或设备驱动加载失败。

1.检查文件系统路径

exportCFLAGS="--sysroot=/path/to/sdk/sysroot"

sysroot配置:交叉编译时需指定--sysroot或通过环境变量设置根文件系统路径。例如,可以通过以下命令设置环境变量:

库文件架构不匹配:确认库文件是aarch64架构,而非x86_64armhf。可以使用file命令检查库文件的架构,例如file libexample.so,如果输出结果显示不是aarch64架构,则需要更换为正确架构的库文件。

1.其他常见问题

makeclean &&makedistcleanmake-j$(nproc)

make clean命令会删除编译生成的中间文件,make distclean则会更彻底地删除配置文件等,重新执行make命令可以确保整个编译过程从最开始的状态进行,有时可以解决一些因残留文件导致的编译错误。

内存不足:链接大型项目时可能因内存不足失败,尝试增加交换分区或简化编译选项。在编译过程中,如果系统提示内存不足,可以通过增加交换分区来临时解决内存问题。或者在make命令中减少并行编译的核心数,如将make -j$(nproc)改为make -j4(假设系统有4个核心),以降低内存的使用量。

ABI兼容性:确保所有库和工具链使用相同的ABI(如glibc版本一致)。不同版本的glibc库可能具有不同的ABI接口,如果库和工具链使用的glibc版本不一致,可能会导致编译或运行时错误。

清理重建:尝试彻底清理后重新编译。可以使用以下命令进行清理和重新编译:

通过以上详细的编译环境搭建步骤和常见报错解决办法,希望能帮助开发者顺利在Ubuntu20.04系统上完成RK3568 Android11的编译工作,为后续的嵌入式开发项目打下坚实的基础。在实际开发过程中,如果遇到其他问题,还可以参考瑞芯微SDK文档以及相关的开源社区论坛,获取更多的技术支持和解决方案。

  • 随机文章
  • 热门文章
  • 热评文章
不容错过
Powered By Z-BlogPHP