Khadas VIM3 開發板Android的源碼編譯
續上篇, 完成源碼的下載後, 如何編譯呢?
首先要把相關的工具準備好, 官網有文章install-toolchains說明, 有2個方法, 第一個方法是直接在ubuntu下一些指令, 另一個方法是利用Docker, 把預先弄好的Docker Image抓下來, 再跑起來, 就可以在裡面進行編譯Android源碼的動作。
因為我之前在電腦上已經裝過編譯Orange Pi的Android 12的工具, 不想2個開發板的環境混在一起, 加上想試一下Docker怎麼使用, 所以選擇了第二個方法。
基本上依文件的指令下就可以, 但裝Docker的部份, 若要取得最新的版本, 可能要去查一下Docker的文件。接著取得wesion/khadas_android:v0.6這個Image, 然後把它跑起來。
文件上寫下這個指令:
sudo docker run --privileged -i -t -v /home/you_name:/home/android wesion/khadas_android:v0.6 bash
全部照抄就可以, 但是/home/you_name:/home/android這個部份要改一下, 前面我們下載Android源碼時, 文件有叫我們建一個工作目錄, 我使用/home/ops/work這個目錄名稱, 所以整個Android源碼的程式都放置在這個目錄下。為了讓Docker跑起來後, 可以存取到Android源碼目錄, 指令的這個部份我改為/home/ops/work:/work (用來取代前面提到的/home/you_name:/home/android)。改成這樣, 下指令, 會看到命令提示字元變成類似:
root@3458795s8df812:/work#
這樣就進去Docker這個環境了, 如果要離開, 只要下exit指令就可, 同樣命令提示字元會回到原來的樣子。在這個環境裡下df指令, 就可以看到可以存取的目錄有那些, 我們只要關心是不是有/work這個目錄就可以了。有的話, cd進去, 然後照著官網的build-android文件做就可以。
以編譯Android 9 64位元為例:
分為2個步驟:
1. 先編譯bootloader
$ cd /home $ cd bootloader/uboot $ ./mk TARGET
注意, 這裡的TARGET, 如果開發板是VIM3, 就要改成kvim3。如果是VIM3L的開發板, 就改成kvim3l。因為官網的文件把這段話放在文件的最下面, 一開始, 我還真的傻傻的照打TARGET, 當然出來一堆錯誤訊息。正常的話, 最後應該會看到類似如下:
Amlogic img found, use new FIP structure!
Creating "fip/_tmp/fip.bin"
Firmware Image Package ToC:
---------------------------
- SCP Firmware BL3-0: offset=0x4000, size=0xD400
- EL3 Runtime Firmware BL3-1: offset=0x14000, size=0x2F150
- Non-Trusted Firmware BL3-3: offset=0x44000, size=0x149570
---------------------------
Bootloader build done!
$ cd /home $ source build/envsetup.sh $ lunch TARGET_LUNCH $ make -jN otapackage
同樣, 這裡的TARGET_LUNCH也要依開發板不同而改填不一樣的值, 對於VIM3開發板來說, 要改成kvim3-userdebug。還有-jN要改成-j8或者-j16之類的, 數字的大小, 基本上填你的主機的CPU核心數就可以。例如, 8核的CPU, 那就填-j8。
很不幸地, 我的第一次編譯嘗試失敗了。
出現了一堆錯誤訊息, 依照訊息的文字說明, 試著google看看, 結果找到vim3-build-android-android-9-0-64-bit-failed這篇, 這是khadas社區的討論區, 可以拉到幾乎最下面的地方, 結果是編譯的這台主機本身的Linux核心版本也會影響Android編譯的成敗。簡單說, 解方就是要去修改art/runtime/mem_map.cc這個檔案。
照這個文件去修改後, 再重新編譯, 就成功了。
留言