在嵌入式開發領域,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文檔以及相關的開源社區論壇,獲取更多的技術支持和解決方案。
-
Android
+關注
關注
12文章
4024瀏覽量
133969 -
環境搭建
+關注
關注
0文章
60瀏覽量
9461 -
RK3568
+關注
關注
5文章
644瀏覽量
7912
發布評論請先 登錄
迅為iTOP-RK3568開發板Android11移植之源碼結構簡介
【北京迅為】itop-rk3568開發板官方Android11移植教程
迅為干貨 |瑞芯微RK3568開發板Android11系統開發筆記
【重磅來襲】迅為RK3568 Android11系統移植視頻教程
迅為RK3568開發Android12系統燒寫 Android 固件
迅為RK3568開發板Android11系統開發筆記分享
迅為iTOP-RK3568開發板Android11移植之源碼結構簡介
Android11修改攝像頭前后置方法,觸覺智能RK3568開發板演示
技術分享 | RK3568 Android11 如何實現自啟動應用
RK3568 Android11編譯環境搭建及報錯解決指南
評論