0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Jetson Nano上编译部署Anbox

星星科技指导员 来源:NVIDIA 作者:NVIDIA 2022-04-21 10:38 次阅读

Jetson Nano 2GB是NVIDIA的一款高性价比嵌入式平台。麻雀虽小五脏俱全,战力强悍,但是惜乎没有原生Android系统支持。目前想在Jetson平台上体验Android,可以使用虚拟机运行Android系统,或者使用Anbox这样的平台。Anbox是基于容器开发的,能够为Android程序提供原生运行支持。今天我们来尝试一下在Jetson Nano上编译部署Anbox,基本步骤参考NVIDIA论坛上的文章[Anbox on jetson nano],根据需要稍作调整。

1. 重新编译并烧写Jetson Nano 2GB内核

本节参考L4T Kernel Customization。

Anbox运行依赖于bander和ashmem两个驱动,Jetson Nano 2GB目前最新的内核版本是4.9.201,这两个驱动已经在Jetson Nano的内核里了只是默认没有打开。一开始我想尝试不重新编译内核直接将这两个驱动编译成模块加载,binder能够正常加载,ashmem无法加载成功。原因是这两个驱动在4.9上不允许单独编译为可加载模块。也就是说,必须跟kernel源码整体编译。保险起见,我选择整体重新编译内核,并打开驱动支持,和论坛里的操作保持一致。

1.1 环境准备

一块已经烧写好镜像,并完成启动初始化的Jetson Nano 2GB设备,参考Getting Started with Jetson Nano 2GB Developer Kit。

Jetson开发推荐使用Ubuntu18.04作为开发机,交叉编译推荐使用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编译并烧写内核

在$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

编译内核:

# 配置环境变量
export CROSS_COMPILE=\
$HOME/l4t-gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
export LOCALVERSION=-tegra-anbox #该环境变量改变生成的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
# 编译内核
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 zImage
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT -j modules
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT -j dtbs # 
make -C $KERNEL_SOURCE ARCH=arm64 O=$KERNEL_OUT INSTALL_MOD_PATH=$KERNEL_MODULES_OUT modules_install
 

编译完成后,我们得到内核镜像:$KERNEL_OUT/arch/arm64/boot/Image以及对应的内核模块文件夹:$KERNEL_MODULES_OUT/lib/modules/4.9.201-tegra-anbox。

更新内核以及模块到开发板:

正常更新内核,需要重做根文件系统,花费时间比较长。我们这里采用快速验证方案:

准备好系统的开发板上电开机,连接好USB线到开发机,确保开发机能通过192.168.55.1地址访问开发板。

通过ssh拷贝内核镜像和模块文件夹到开发板,至此主机的操作全部完成,后续全部在开发板上操作。备份原始镜像/boot/Image到/boot/Image.backup:

# 主机执行
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 # 登录开发板

# 开发板上执行
sudo cp /boot/Image /boot/Image.backup # 备份原始kernel
sudo mv ~/Image /boot/Image # 更新内核
sudo mv ~/4.9.201-tegra-anbox /lib/modules/  # 拷贝内核模块
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}
 
更新权限:
创建 /etc/udev/rules.d/99-anbox.rules文件,内容如下:
KERNEL==“ashmem”, NAME="%k", MODE=“0666”
KERNEL==“binder”, NAME="%k", MODE=“0666”
 
然后执行:
sudo udevadm control --reload-rules && udevadm trigger

重启开发板,确认当前工作内核版本为4.9.201-tegra-anbox,设备/dev/ashmem和/dev/binder都存在。

2.更新libsdl2

原帖中说18.04(开发板系统版本)的libsdl2库有一个bug,所以需要更新libsdl2。具体是什么问题没有仔细去查,这里我们选择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
wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/libsdl2/2.0.9+dfsg1-1ubuntu1.19.04.1/libsdl2_2.0.9+dfsg1-1ubuntu1.19.04.1.dsc
wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/libsdl2/2.0.9+dfsg1-1ubuntu1.19.04.1/libsdl2_2.0.9+dfsg1-1ubuntu1.19.04.1.debian.tar.xz
wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/libsdl2/2.0.9+dfsg1-1ubuntu1.19.04.1/libsdl2_2.0.9+dfsg1.orig.tar.xz
# 编译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

3.编译安装Anbox

下载Anbox源代码,编译安装:

git clone https://github.com/HarleyPato/anbox-arm64
mkdir -p anbox-arm64/build && cd anbox-arm64/build
cmake .. && make && sudo make install
sudo cp /usr/local/bin/anbox /usr/bin/

下载Android镜像:

wget http://anbox.postmarketos.org/android-7.1.2_r39-anbox_arm64-userdebug.img
mv android-7.1.2_r39-anbox_arm64-userdebug.img /var/lib/anbox/android.img

通过Anbox发布的deb安装包获取配置文件:

mkdir anbox-deb && cd anbox-deb
wget http://ports.ubuntu.com/pool/multiverse/a/anbox/anbox_0.0~git20191115-1build1_arm64.deb
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服务:

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状态:

sudo systemctl status anbox-container-manager.service
systemctl --user status anbox-session-manager.service

结果应该类似下图:

至此所有安装均已完成,重启开发板,启动Anbox,就能看到Android界面了。可以通过adb install安装apk到Anbox Android环境中并运行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19107

    浏览量

    304833
  • Android
    +关注

    关注

    12

    文章

    3935

    浏览量

    127348
  • 虚拟机
    +关注

    关注

    1

    文章

    914

    浏览量

    28160
收藏 人收藏

    评论

    相关推荐

    NVIDIA发布小巧高性价比的Jetson Orin Nano Super开发者套件

    NVIDIA近期推出了一款全新的生成式AI超级计算机——Jetson Orin Nano Super开发者套件。这款开发者套件以其小巧的尺寸和高性价比吸引了广泛关注。 Jetson Orin
    的头像 发表于 12-19 11:28 306次阅读

    Made with KiCad(二):Jetson Origin Baseboard

    “   该项目包含支持NVIDIA Jetson Orin NanoJetson Orin NX系统模块 (SoMs)的基板并开源了所有硬件设计文件。该基板对SoM的IO接口进行了 分解。此外
    的头像 发表于 11-12 12:24 1049次阅读
    Made with KiCad(二):<b class='flag-5'>Jetson</b> Origin Baseboard

    何在DRA821U使用Linux实现快速引导

    电子发烧友网站提供《如何在DRA821U使用Linux实现快速引导.pdf》资料免费下载
    发表于 09-03 10:11 0次下载
    如<b class='flag-5'>何在</b>DRA821U<b class='flag-5'>上</b>使用Linux实现快速引导

    使用myAGV、Jetson Nano主板和3D摄像头,实现了RTAB-Map的三维建图功能!

    本文将展示如何使用myAGV Jetson Nano移动平台搭载Jetson Nano BO1主板,结合RTAB-Map和3D相机,实现更加立体和细致的环境建图。myAGV
    的头像 发表于 08-28 10:22 542次阅读
    使用myAGV、<b class='flag-5'>Jetson</b> <b class='flag-5'>Nano</b>主板和3D摄像头,实现了RTAB-Map的三维建图功能!

    何在tx2部署模型

    在本文中,我们将详细介绍如何在NVIDIA Jetson TX2上部署深度学习模型。NVIDIA Jetson TX2是一款专为边缘计算和人工智能应用而设计的高性能嵌入式平台。它具有强
    的头像 发表于 07-09 10:16 556次阅读

    Jetson Nano集成探索大象机器人myAGV的 SLAM 算法!

    情况下。 产品介绍 myAGV-Jetson Nano 这是第二代的myAGV,第一代的只有raspberry Pi 4B版本,算力方面有所欠缺,在二代的时
    的头像 发表于 06-03 14:13 488次阅读
    <b class='flag-5'>Jetson</b> <b class='flag-5'>Nano</b>集成探索大象机器人myAGV<b class='flag-5'>上</b>的 SLAM 算法!

    ELF 1技术贴|如何在Ubuntu中编译OpenCV库

    在之前发布的文章中探讨了交叉编译OpenCV并部署至嵌入式系统的方法。然而,在调试阶段,我们发现在Ubuntu环境下将OpenCV编译为X86架构可能更加方便和高效。通过在主机上编译
    的头像 发表于 05-31 16:41 1162次阅读
    ELF 1技术贴|如<b class='flag-5'>何在</b>Ubuntu中<b class='flag-5'>编译</b>OpenCV库

    Nvidia Jetson Nano + CYW55573/AWXB327MA-PUR M.2无法使用操作系统内置的网络管理器管理Wi-Fi如何解决?

    我们使用的是 Nvidia Jetson Nano + CYW55573/AWXB327MA-PUR M.2 ,请参阅 Nvidia Jetson 与英飞凌 AIROC Wi-Fi 6
    发表于 05-23 06:47

    鸿蒙实战开发-本地部署、SmartPerf 编译部署指导文档

    install 在项目目录下运行命令: npm run build 编译成功后会有main 可执行文件生成。 项目部署 直接运行 ./main 可执行程序,完成项目的部署。 访问项目 在浏览器
    发表于 05-09 14:23

    NANO STM32F103RBT6升级失败,烧录不了是哪里的问题?

    今天用久别的NANO STM32F103RBT6的开发板,在公司的电脑编译基本工程,怎么就烧录不了了?望好友伸出援助之手,不胜感激。
    发表于 04-09 06:27

    stm32CubeMX+Nano调试时board.c不执行是为什么?

    硬件平台是正点原子stm32H743IIT6,使用stm32CubeMX+Nano3.1.5,生成stm32CubeIDE代码在stm32CubeIDE中编译,或者生成keil代码在SEGGER
    发表于 03-26 06:43

    【LicheeRV-Nano开发套件试用体验】LicheeRV-Nano的IAI技术应用

    LicheeRV-Nano的IAI技术应用 作者:大信(8125036) 一、LicheeRV-Nan开发板印象 昨天收到了 Mikv-V DUO 开发板的兄弟板 - LicheeRV-Nano
    发表于 03-07 17:32

    基于OpenCV DNN实现YOLOv8的模型部署与推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署在Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 1584次阅读
    基于OpenCV DNN实现YOLOv8的模型<b class='flag-5'>部署</b>与推理演示

    何在MacOS编译OpenVINO C++项目呢?

    英特尔公司发行的模型部署工具 OpenVINO 模型部署套件,可以实现在不同系统环境下运行,且发布的 OpenVINO 2023 最新版目前已经支持 MacOS 系统并同时支持在苹果 M 系列芯片上部署模型。
    的头像 发表于 01-11 18:07 895次阅读
    如<b class='flag-5'>何在</b>MacOS<b class='flag-5'>上</b><b class='flag-5'>编译</b>OpenVINO C++项目呢?

    何在KW45-EVK使用RTC

    电子发烧友网站提供《如何在KW45-EVK使用RTC.pdf》资料免费下载
    发表于 01-03 09:41 0次下载
    如<b class='flag-5'>何在</b>KW45-EVK<b class='flag-5'>上</b>使用RTC