**Jetson Nano 2GB是NVIDIA的一款高性價比嵌入式平臺。麻雀雖小五臟俱全,戰(zhàn)力強悍,但是惜乎沒有原生Android系統(tǒng)支持。目前想在Jetson平臺上體驗Android,可以使用虛擬機運行Android系統(tǒng),或者使用Anbox這樣的平臺。
Anbox是基于容器開發(fā)的,能夠為Android程序提供原生運行支持。今天我們來嘗試一下在Jetson Nano上編譯部署Anbox,基本步驟參考NVIDIA論壇上的文章[Anbox on jetson nano],根據(jù)需要稍作調(diào)整。
重新編譯并燒寫Jetson Nano 2GB內(nèi)核
本節(jié)參考L4T Kernel Customization。
Anbox運行依賴于bander和ashmem兩個驅(qū)動,Jetson Nano 2GB目前最新的內(nèi)核版本是4.9.201,這兩個驅(qū)動已經(jīng)在Jetson Nano的內(nèi)核里了只是默認(rèn)沒有打開。一開始我想嘗試不重新編譯內(nèi)核直接將這兩個驅(qū)動編譯成模塊加載,binder能夠正常加載,ashmem無法加載成功。原因是這兩個驅(qū)動在4.9上不允許單獨編譯為可加載模塊。也就是說,必須跟kernel源碼整體編譯。保險起見,我選擇整體重新編譯內(nèi)核,并打開驅(qū)動支持,和論壇里的操作保持一致。
1.1 環(huán)境準(zhǔn)備
一塊已經(jīng)燒寫好鏡像,并完成啟動初始化的Jetson Nano 2GB設(shè)備,參考Getting Started with Jetson Nano 2GB Developer Kit。
Jetson開發(fā)推薦使用Ubuntu18.04作為開發(fā)機,交叉編譯推薦使用Linaro GCC 7,kernel源代碼可以使用Jetpack提供的腳本通過git獲取,或者手動下載,我們這里使用手動下載[L4T Driver Package (BSP) Sources]。
解壓縮交叉編譯工具鏈
mkdir $HOME/l4t-gcc
cd $HOME/l4t-gcc
tar Jxvf /PATH_TO_DOWNLOADS/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz
解壓縮L4T BSP源碼包及kernel
mkdir $HOME/l4t-source
cd $HOME/l4t-source
tar jxvf /PATH_TO_DOWNLOADS/public_sources.tbz2
cd Linux_for_Tegra/source/public
tar jxvf kernel_src.tbz2
1.2 編譯并燒寫內(nèi)核
在$HOME/l4t-source/Linux_for_Tegra/source/public/kernel/kernel-4.9/arch/arm64/configs/tegra_defconfig文件末尾,增加:
Anbox Configuration
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDER_IPC_SELFTEST=y
CONFIG_ASHMEM=y
編譯內(nèi)核:
配置環(huán)境變量
$HOME/l4t-gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
export LOCALVERSION=-tegra-anbox #該環(huán)境變量改變生成的kernel后綴
export KERNEL_SOURCE=
$HOME/l4t-source/Linux_for_Tegra/source/public/kernel/kernel-4.9
export KERNEL_OUT=$KERNEL_SOURCE/img_out #image output dir
export KERNEL_MODULES_OUT=$KERNEL_SOURCE/mod_out #modules output dir
編譯內(nèi)核
cd $TEGRA_KERNEL_SRC_DIR
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT tegra_defconfig
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT -j
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT -j
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT -j
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT INSTALL_MOD_PATH=$KERNEL_MODULES_OUT modules_install
編譯完成后,我們得到內(nèi)核鏡像:$
KERNEL_OUT/arch/arm64/boot/Image以及對應(yīng)的內(nèi)核模塊文件夾:$KERNEL_MODULES_OUT/lib/modules/4.9.201-tegra-anbox。
更新內(nèi)核以及模塊到開發(fā)板:
正常更新內(nèi)核,需要重做根文件系統(tǒng),花費時間比較長。我們這里采用快速驗證方案:
準(zhǔn)備好系統(tǒng)的開發(fā)板上電開機,連接好USB線到開發(fā)機,確保開發(fā)機能通過192.168.55.1地址訪問開發(fā)板。
通過ssh拷貝內(nèi)核鏡像和模塊文件夾到開發(fā)板,至此主機的操作全部完成,后續(xù)全部在開發(fā)板上操作。備份原始鏡像/boot/Image到/boot/Image.backup:
主機執(zhí)行
scp $KERNEL_OUT/arch/arm64/boot/Image $USER@192.168.55.1:~/
scp -R $KERNEL_MODULES_OUT/lib/modules/4.9.201-tegra-anbox $USER@192.168.55.1:~/
ssh $USER@192.168.55.1 # 登錄開發(fā)板
開發(fā)板上執(zhí)行
sudo cp /boot/Image /boot/Image.backup # 備份原始kernel
sudo mv ~/Image /boot/Image # 更新內(nèi)核
sudo mv ~/4.9.201-tegra-anbox /lib/modules/ # 拷貝內(nèi)核模塊
sudo update-initramfs -c -k 4.9.201-tegra-anbox # 更新initramfs
cd /boot/
sudo ln -sf initrd.img-4.9.201-tegra-anbox initrd.img
完成以后用編輯
/boot/extlinux/extlinux.conf,去掉LABEL backup以及后面的注釋,類似這樣:
TIMEOUT 30
DEFAULT primary
MENU TITLE L4T boot options
LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
INITRD /boot/initrd
APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
When testing a custom kernel, it is recommended that you create a backup of
the original kernel and add a new entry to this file so that the device can
fallback to the original kernel. To do this:
1, Make a backup of the original kernel
sudo cp /boot/Image /boot/Image.backup
2, Copy your custom kernel into /boot/Image
3, Uncomment below menu setting lines for the original kernel
4, Reboot
LABEL backup
MENU LABEL backup kernel
LINUX /boot/Image.backup
INITRD /boot/initrd
APPEND ${cbootargs}
更新權(quán)限:
創(chuàng)建
/etc/udev/rules.d/99-anbox.rules文件,內(nèi)容如下:
KERNEL==“ashmem”, NAME="%k", MODE=“0666”
KERNEL==“binder”, NAME="%k", MODE=“0666”
然后執(zhí)行:
sudo udevadm control --reload-rules && udevadm trigger
重啟開發(fā)板,確認(rèn)當(dāng)前工作內(nèi)核版本為4.9.201-tegra-anbox,設(shè)備/dev/ashmem和/dev/binder都存在。
更新libsdl2庫
原帖中說18.04(開發(fā)板系統(tǒng)版本)的libsdl2庫有一個bug,所以需要更新libsdl2。具體是什么問題沒有仔細(xì)去查,這里我們選擇follow這一步操作:
安裝依賴包
sudo apt install dot2tex build-essential cmake cmake-data debhelper dbus google-mock libboost-dev libboost-filesystem-dev libboost-log-dev libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-test-dev libboost-thread-dev libcap-dev libsystemd-dev libegl1-mesa-dev libgles2-mesa-dev libglm-dev libgtest-dev liblxc1 libproperties-cpp-dev libprotobuf-dev lxc-dev pkg-config protobuf-compiler
下載libsdl源代碼
mkdr libsdl-source && cd libsdl-source
wgethttps://launchpad.net/ubuntu/...
wgethttps://launchpad.net/ubuntu/...
wgethttps://launchpad.net/ubuntu/...
編譯deb包
dpkg-source -x libsdl2_2.0.9+dfsg1-1ubuntu1.19.04.1.dsc
cd libsdl2-2.0.9+dfsg1/
dpkg-buildpackage -rfakeroot -b -uc -us
cd ..
安裝deb
sudo dpkg -i libsdl2-2.0-0_2.0.9+dfsg1-1ubuntu1.19.04.1_arm64.deb libsdl2-dev_2.0.9+dfsg1-1ubuntu1.19.04.1_arm64.deb libsdl2-doc_2.0.9+dfsg1-1ubuntu1.19.04.1_all.deb
編譯安裝Anbox
下載Anbox源代碼,編譯安裝:
git clonehttps://github.com/HarleyPato...
mkdir -p anbox-arm64/build && cd anbox-arm64/build
cmake .. && make && sudo make install
sudo cp /usr/local/bin/anbox /usr/bin/
下載Android鏡像:
wgethttp://anbox.postmarketos.org...
mv android-7.1.2_r39-anbox_arm64-userdebug.img /var/lib/anbox/android.img
通過Anbox發(fā)布的deb安裝包獲取配置文件:
mkdir anbox-deb && cd anbox-deb
wgethttp://ports.ubuntu.com/pool/...
ar x anbox_0.0~git20191115-1build1_arm64.deb
tar Jxvf data.tar.xz
sudo cp ./lib/systemd/system/anbox-container-manager.service /lib/systemd/system/
sudo cp ./usr/lib/systemd/user/anbox-session-manager.service /usr/lib/systemd/usr/
在/lib/systemd/system/anbox-container-manager.service文件中注釋掉這兩行:
ExecStartPre=/sbin/modprobe ashmem_linux
ExecStartPre=/sbin/modprobe binder_linux
在/usr/lib/systemd/user/anbox-session-manager.service文件中,ExecStart前添加:
Environment="DISPLAY=:0"
啟動Anbox服務(wù):
sudo systemctl unmask anbox-container-manager.service
sudo systemctl start anbox-container-manager.service
sudo systemctl enable anbox-container-manager.service
systemctl --user unmask anbox-session-manager.service
systemctl --user start anbox-session-manager.service
systemctl --user enable anbox-session-manager.service
檢查Anbox狀態(tài):
sudo systemctl status anbox-container-manager.service
systemctl --user status anbox-session-manager.service
至此所有安裝均已完成,重啟開發(fā)板,啟動Anbox,就能看到Android界面了??梢酝ㄟ^adb install安裝apk到Anbox Android環(huán)境中并運行。
文章轉(zhuǎn)自:技術(shù)社區(qū)
作者:NVIDIA英偉達(dá)嵌入式系統(tǒng)
編輯:jq
-
源碼
+關(guān)注
關(guān)注
8文章
641瀏覽量
29213 -
容器
+關(guān)注
關(guān)注
0文章
495瀏覽量
22062 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32871
原文標(biāo)題:技術(shù)分享 | 使用Anbox在Jetson Nano 2GB上運行Android應(yīng)用程序
文章出處:【微信號:ic-china,微信公眾號:ICExpo】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論