在嵌入式開發(fā)領(lǐng)域,RK3568芯片憑借其出色的性能被廣泛應(yīng)用?;?/span>RK3568進(jìn)行Android11系統(tǒng)的開發(fā),首先要搭建好編譯環(huán)境。本文將詳細(xì)介紹在Ubuntu20.04系統(tǒng)上搭建RK3568 Android11編譯環(huán)境的過程,并針對常見的報(bào)錯(cuò)給出解決辦法。

一、編譯環(huán)境搭建步驟
(一)安裝必要的依賴包
在開始搭建編譯環(huán)境之前,需要確保系統(tǒng)安裝了AOSP編譯工具和相關(guān)依賴。打開終端,依次輸入以下命令:
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
這些命令會(huì)更新軟件包列表,并安裝編譯所需的各種工具和庫。其中,openjdk-8-jdk是編譯Android系統(tǒng)所必需的Java開發(fā)工具包,因?yàn)?/span>Android系統(tǒng)的部分代碼是基于Java語言編寫的。而lib32ncurses5-dev等32位庫文件的安裝,是由于一些編譯工具在運(yùn)行時(shí)可能會(huì)依賴32位的庫環(huán)境。
(二)安裝repo工具
repo工具是Android開源項(xiàng)目用來管理多個(gè)Git倉庫的工具,在獲取Android源碼時(shí)必不可少。通過以下命令安裝repo工具:
mkdir-p ~/bincurl > ~/bin/repochmoda+x ~/bin/repoexportPATH=~/bin:$PATH
上述命令首先創(chuàng)建了一個(gè)~/bin目錄用于存放repo工具,接著通過curl命令下載repo工具腳本,并賦予其可執(zhí)行權(quán)限,最后將~/bin目錄添加到系統(tǒng)路徑中,這樣在任何目錄下都可以直接使用repo命令。
(三)初始化和同步源代碼
完成repo工具的安裝后,就可以使用它來初始化和同步Android11的源代碼。在終端中輸入以下命令:
repoinit -u -b android-11.0.0_r8(舉例)reposync
repo init命令用于初始化一個(gè)新的Android代碼倉庫,-u參數(shù)指定了代碼倉庫的URL,-b參數(shù)指定了要同步的分支版本,這里選擇的是Android11.0.0的第8個(gè)版本。repo sync命令則會(huì)根據(jù)初始化的配置,從遠(yuǎn)程倉庫同步所有相關(guān)的代碼到本地,這個(gè)過程可能會(huì)比較耗時(shí),取決于網(wǎng)絡(luò)狀況和代碼量的大小。
(四)構(gòu)建系統(tǒng)
當(dāng)源代碼同步完成后,就可以開始構(gòu)建系統(tǒng)了。在構(gòu)建之前,需要先設(shè)置一些環(huán)境變量并選擇編譯目標(biāo)。在終端中依次輸入以下命令:
sourcebuild/envsetup.shlunch rk3568-userdebugmake -j$(nproc)
source build/envsetup.sh命令用于設(shè)置Android編譯環(huán)境的相關(guān)變量,這些變量包含了編譯所需的各種路徑和配置信息。lunch命令用于選擇編譯目標(biāo),rk3568-userdebug表示針對RK3568芯片的用戶調(diào)試版本。最后的make -j$(nproc)命令是正式開始編譯系統(tǒng),-j$(nproc)參數(shù)表示使用系統(tǒng)的所有可用核心數(shù)進(jìn)行并行編譯,以加快編譯速度。
二、常見報(bào)錯(cuò)及解決辦法
(一)找不到libncurses.so.5庫
在編譯過程中,有時(shí)可能會(huì)遇到類似“cannot open shared object file: No such file or directory”關(guān)于找不到libncurses.so.5庫的錯(cuò)誤。這是因?yàn)榫幾g過程依賴的libncurses庫缺失或版本不匹配。
1.對于Ubuntu/Debian系統(tǒng):
sudo apt-getupdatesudo apt-getinstall libncurses5ls/usr/lib/libncurses.so.5
(二)module source path "xxx/.git" does not exist錯(cuò)誤
在編譯時(shí),可能會(huì)出現(xiàn)類似于“error: hardware/rockchip/librga/Android.bp1: module "gen_rga_version": module source path "hardware/rockchip/librga/.git" does not exist”這樣的錯(cuò)誤。這通常是因?yàn)橄嚓P(guān)模塊在配置中引用了.git目錄,但實(shí)際該目錄不存在。
解決辦法是打開對應(yīng)的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/這一行刪除,保存文件后重新編譯即可。
(三)編譯內(nèi)核時(shí)找不到openssl/bio.h文件
首次編譯內(nèi)核時(shí),可能會(huì)遇到找不到openssl/bio.h文件的錯(cuò)誤,錯(cuò)誤信息類似如下:
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: 沒有那個(gè)文件或目錄compilation terminated.make(1): *** (scripts/extract-cert) 錯(cuò)誤1make: *** (scripts) 錯(cuò)誤2
這是因?yàn)橄到y(tǒng)缺少libssl-dev庫。解決方法如下:
1.安裝libssl-dev庫:
?在終端中輸入命令sudo apt-get install libssl-dev嘗試安裝。但在Ubuntu20.04系統(tǒng)中,可能會(huì)出現(xiàn)軟件沖突問題,如提示“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。此時(shí)系統(tǒng)可能會(huì)提示將對libssl1.0.0進(jìn)行降級(jí)操作,確認(rèn)繼續(xù)即可。
1.重新安裝libssl-dev:
?安裝完指定版本的libssl1.0.0后,再次輸入命令sudo apt-get install libssl-dev進(jìn)行安裝。安裝完成后,重新編譯內(nèi)核即可正常進(jìn)行。
(四)編譯過程中的鏈接錯(cuò)誤
在RK3568的編譯過程中,還可能會(huì)遇到鏈接錯(cuò)誤,這類錯(cuò)誤通常與工具鏈配置、依賴庫缺失、符號(hào)未定義或路徑問題有關(guān)。
1.確認(rèn)錯(cuò)誤信息:
?常見的鏈接錯(cuò)誤信息有:
undefined reference to...:表示未定義的符號(hào)(函數(shù)或變量),可能是源碼缺失或依賴庫未鏈接。例如,如果在編譯過程中提示“undefined reference to 'function_name'”,則需要檢查是否有包含function_name函數(shù)定義的源文件未被正確編譯或鏈接。
cannot find -lxxx:表示找不到指定的庫文件(如-lrockchip)。比如提示“cannot find -lrockchip”,那就需要確認(rèn)librockchip.so庫文件是否存在,以及鏈接路徑是否正確。
relocation truncated to fit:這通常是內(nèi)存地址分配問題,常見于32/64位混合編譯的情況。
1.檢查交叉編譯工具鏈:
whichaarch64-linux-gnu-gcc
exportCROSS_COMPILE=aarch64-linux-gnu-exportARCH=arm64
?RK3568是ARM64架構(gòu),需要使用aarch64-linux-gnu-系列工具鏈??梢酝ㄟ^以下命令確認(rèn)工具鏈?zhǔn)欠褚寻惭b且路徑正確:
?如果輸出類似“/usr/bin/aarch64-linux-gnu-gcc”,則說明工具鏈已安裝且路徑正確。如果未安裝,需要從官方或可靠渠道下載并安裝對應(yīng)的交叉編譯工具鏈。
?在編譯時(shí),還需要指定工具鏈,通過以下命令設(shè)置環(huán)境變量:
1.檢查依賴庫:
?缺失庫文件:確保所有依賴庫(如librockchip.so、libmali.so)已正確安裝,且路徑通過-L指定。例如,如果librockchip.so庫文件安裝在/usr/local/lib目錄下,在編譯命令中需要添加-L/usr/local/lib來指定庫文件的搜索路徑。
?鏈接順序問題:調(diào)整鏈接順序,確保被依賴的庫放在后面。例如,假設(shè)main庫依賴sub庫,那么鏈接庫的順序應(yīng)該是-lsub -lmain,而不是-lmain -lsub。
1.符號(hào)未定義(undefined reference):
?源碼缺失:檢查是否漏編譯某些源碼文件(.c/.cpp),或Makefile中未包含相關(guān)目標(biāo)。比如在一個(gè)項(xiàng)目中,如果有一個(gè)function.c文件實(shí)現(xiàn)了某個(gè)功能,但在Makefile中沒有將其添加到編譯目標(biāo)中,就會(huì)導(dǎo)致鏈接時(shí)找不到該函數(shù)的定義。
?頭文件與實(shí)現(xiàn)不匹配:確保頭文件中的函數(shù)聲明與實(shí)現(xiàn)一致,例如在C++中,如果頭文件中函數(shù)聲明使用了extern "C",那么對應(yīng)的實(shí)現(xiàn)文件也需要使用extern "C",否則會(huì)導(dǎo)致鏈接錯(cuò)誤。
?靜態(tài)庫順序:對于靜態(tài)庫,需要按依賴順序排列,或用--start-group和--end-group包裹。例如,如果有libfoo.a和libbar.a兩個(gè)靜態(tài)庫,且libfoo.a依賴libbar.a,那么鏈接命令可以寫成-Wl,--start-group -lfoo -lbar -Wl,--end-group。
1.SDK或內(nèi)核編譯問題:
makerockchip_linux_defconfigmakeprepare modules_prepare
?內(nèi)核配置:若編譯內(nèi)核模塊,需先編譯內(nèi)核頭文件,并確保模塊與內(nèi)核版本一致??梢酝ㄟ^以下命令進(jìn)行內(nèi)核配置和準(zhǔn)備:
?設(shè)備樹未編譯:確認(rèn)設(shè)備樹文件(.dts)已編譯為.dtb,并放置在正確路徑。設(shè)備樹文件描述了硬件設(shè)備的信息,如果設(shè)備樹未正確編譯或放置位置錯(cuò)誤,可能會(huì)導(dǎo)致編譯錯(cuò)誤或設(shè)備驅(qū)動(dòng)加載失敗。
1.檢查文件系統(tǒng)路徑:
exportCFLAGS="--sysroot=/path/to/sdk/sysroot"
?sysroot配置:交叉編譯時(shí)需指定--sysroot或通過環(huán)境變量設(shè)置根文件系統(tǒng)路徑。例如,可以通過以下命令設(shè)置環(huán)境變量:
?庫文件架構(gòu)不匹配:確認(rèn)庫文件是aarch64架構(gòu),而非x86_64或armhf??梢允褂?/span>file命令檢查庫文件的架構(gòu),例如file libexample.so,如果輸出結(jié)果顯示不是aarch64架構(gòu),則需要更換為正確架構(gòu)的庫文件。
1.其他常見問題:
makeclean &&makedistcleanmake-j$(nproc)
make clean命令會(huì)刪除編譯生成的中間文件,make distclean則會(huì)更徹底地刪除配置文件等,重新執(zhí)行make命令可以確保整個(gè)編譯過程從最開始的狀態(tài)進(jìn)行,有時(shí)可以解決一些因殘留文件導(dǎo)致的編譯錯(cuò)誤。
?內(nèi)存不足:鏈接大型項(xiàng)目時(shí)可能因內(nèi)存不足失敗,嘗試增加交換分區(qū)或簡化編譯選項(xiàng)。在編譯過程中,如果系統(tǒng)提示內(nèi)存不足,可以通過增加交換分區(qū)來臨時(shí)解決內(nèi)存問題?;蛘咴?/span>make命令中減少并行編譯的核心數(shù),如將make -j$(nproc)改為make -j4(假設(shè)系統(tǒng)有4個(gè)核心),以降低內(nèi)存的使用量。
?ABI兼容性:確保所有庫和工具鏈?zhǔn)褂孟嗤?/span>ABI(如glibc版本一致)。不同版本的glibc庫可能具有不同的ABI接口,如果庫和工具鏈?zhǔn)褂玫?/span>glibc版本不一致,可能會(huì)導(dǎo)致編譯或運(yùn)行時(shí)錯(cuò)誤。
?清理重建:嘗試徹底清理后重新編譯??梢允褂靡韵旅钸M(jìn)行清理和重新編譯:
通過以上詳細(xì)的編譯環(huán)境搭建步驟和常見報(bào)錯(cuò)解決辦法,希望能幫助開發(fā)者順利在Ubuntu20.04系統(tǒng)上完成RK3568 Android11的編譯工作,為后續(xù)的嵌入式開發(fā)項(xiàng)目打下堅(jiān)實(shí)的基礎(chǔ)。在實(shí)際開發(fā)過程中,如果遇到其他問題,還可以參考瑞芯微SDK文檔以及相關(guān)的開源社區(qū)論壇,獲取更多的技術(shù)支持和解決方案。
-
Android
+關(guān)注
關(guān)注
12文章
4035瀏覽量
134429 -
環(huán)境搭建
+關(guān)注
關(guān)注
0文章
60瀏覽量
9488 -
RK3568
+關(guān)注
關(guān)注
5文章
654瀏覽量
8090
發(fā)布評(píng)論請先 登錄
迅為iTOP-RK3568開發(fā)板Android11移植之源碼結(jié)構(gòu)簡介
【北京迅為】itop-rk3568開發(fā)板官方Android11移植教程
【超前發(fā)布】瑞芯微RK3568視頻教程
迅為干貨 |瑞芯微RK3568開發(fā)板Android11系統(tǒng)開發(fā)筆記
【重磅來襲】迅為RK3568 Android11系統(tǒng)移植視頻教程
迅為RK3568開發(fā)Android12系統(tǒng)燒寫 Android 固件
迅為RK3568開發(fā)板Android11系統(tǒng)開發(fā)筆記分享
iTOP-RK3568開發(fā)板Android11設(shè)置語言和默認(rèn)時(shí)區(qū)
迅為iTOP-RK3568開發(fā)板Android11移植之源碼結(jié)構(gòu)簡介
Android11修改攝像頭前后置方法,觸覺智能RK3568開發(fā)板演示
技術(shù)分享 | RK3568 Android11 如何實(shí)現(xiàn)自啟動(dòng)應(yīng)用
RK3568 Android11編譯環(huán)境搭建及報(bào)錯(cuò)解決指南
評(píng)論