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

电子说

1.4w人已加入

描述

 

 

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

RK3568

 

 

一、编译环境搭建步骤

 

(一)安装必要的依赖包

 

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

 

 

  •  
  •  
sudo apt-get updatesudo apt-get install -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-dev 32 位库文件的安装,是由于一些编译工具在运行时可能会依赖 32 位的库环境。

 

 

(二)安装 repo 工具

 

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

 

 

  •  
  •  
  •  
  •  
mkdir -p ~/bincurl > ~/bin/repochmod a+x ~/bin/repoexport PATH=~/bin:$PATH

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

 

 

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

 

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

 

 

  •  
  •  
repo init -u -b android-11.0.0_r8(举例)repo sync

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

 

 

(四)构建系统

 

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

 

 

  •  
  •  
  •  
source build/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-get updatesudo apt-get install 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.检查交叉编译工具链

 

 

  •  
which aarch64-linux-gnu-gcc
  •  
  •  
export CROSS_COMPILE=aarch64-linux-gnu-export ARCH=arm64

RK3568 是 ARM64 架构,需要使用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 或内核编译问题

 

 

  •  
  •  
make rockchip_linux_defconfigmake prepare modules_prepare

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

 

 

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

 

 

1.检查文件系统路径

 

 

  •  
export CFLAGS="--sysroot=/path/to/sdk/sysroot"

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

 

 

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

 

 

1.其他常见问题

 

 

  •  
  •  
make clean && make distcleanmake -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 文档以及相关的开源社区论坛,获取更多的技术支持和解决方案。

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分