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

一、编译环境搭建步骤
(一)安装必要的依赖包
在开始搭建编译环境之前,需要确保系统安装了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-dev等32位库文件的安装,是由于一些编译工具在运行时可能会依赖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
◦RK3568是ARM64架构,需要使用aarch64-linux-gnu-系列工具链。可以通过以下命令确认工具链是否已安装且路径正确:
◦如果输出类似“/usr/bin/aarch64-linux-gnu-gcc”,则说明工具链已安装且路径正确。如果未安装,需要从官方或可靠渠道下载并安装对应的交叉编译工具链。
◦在编译时,还需要指定工具链,通过以下命令设置环境变量:
1.检查依赖库:
◦缺失库文件:确保所有依赖库(如librockchip.so、libmali.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.a和libbar.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_64或armhf。可以使用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文档以及相关的开源社区论坛,获取更多的技术支持和解决方案。
- 随机文章
- 热门文章
- 热评文章
- 4月10日将迎“龙年龙月龙日龙时”
- 奥运会在即,巴黎计划打造“无蚊城市”
- 3月以来黄金ETF规模大增
- 让辽中南城市群迸发东北振兴增长极属性
- 黄金突破关键阻力?2432美元/盎司成为下一目标!
- 美国认同日韩对本币大跌的“严重”关切,美元回落支撑金价反弹
- 油价急跌3美元!业界有点懵,事实上盘面早有危险信号
- 傅鹏博、赵枫……明星基金经理一季度持仓变化曝光
- 新门派峨眉!《剑侠世界:起源》峨眉论剑资料片今日8点上线
- 央行:一季度贷款总量继续保持平稳较快增长
- 63岁大姐疑因点痣导致癌变,杭州有医院每年都能接诊多例!医生:身上的黑痣,最怕一件事
- MH迈汇:OPEC+对抑制油价上涨至100美元至关重要
- 美联储态度转鹰?普徕仕:预计今年仍会降息两次?
- 1“赛事+”提升城市“流量” 陕西商洛拓经济发展新“赛道”
- 2“五一”临近 持基过节的投资者要注意这几点
- 3华发股份:成功入选“人民优选”品牌 五一黄金周热销30亿
- 4钟鼓楼老街区的古都新事
- 5非常危险!女子摔成粉碎性骨折!又是因为洞洞鞋,夏天多人中招……
- 6金税四期试点上线,财税体制改革拉开帷幕!或有资金借道信创ETF基金(562030)逢跌进场布局
- 7到2027年产业规模达到2000亿元 浙江发布历史经典产业高质量发展计划
- 8初步数据:我国一季度经常账户顺差392亿美元
- 9IDC:24Q1全球PC出货量恢复增长 达到疫情前水平
- 10“发现山西之美”TDC旅游发现者大会举办:共话文旅新生态 邀客体验新玩法
- 11(中国新貌)“国宝”大熊猫:栖居更美境 云游更广天
- 12培养工程领域专业人才 非洲首所交通大学在尼日利亚投入使用
- 13瑞众保险副总裁俞德本出任公司临时负责人
- 1大裁员下,特斯拉两名顶级高管离职
- 2奇瑞将与欧洲高端品牌签署技术平台授权协议
- 32024中国长三角青年企业家交流大会在杭州举办
- 4雷克萨斯GX中东版 全部在售 2023款 2022款 2020款 2019款 2018款成都远卓名车雷克萨斯GX中东版团购钜惠20万 欢迎上门试驾
- 5零跑C16将搭载中创新航磷酸铁锂电池
- 6Q1净利微增7%,宁德时代股东总数较2023年年末减少10728户
- 7哪吒,需要背水一战
- 8“新”中有“机”!创新服务承接新流量 撬动消费升级
- 9非创始版SU7何时交付 小米:工厂生产爬坡 全力提高产能
- 10央媒评卧铺挂帘:谁买的票谁做主
- 11江西南昌首部“多规合一”国土空间总体规划获批
- 12方程豹旗舰硬派越野!豹8正式亮相:仰望U8“青春版”登场
- 13583家族/造型霸气 方程豹豹8量产版发布



