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

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

3天内不再提示

如何使用Anbox在Jetson Nano 2GB上运行Android应用程序

ICExpo 来源:NVIDIA英伟达中国 作者:NVIDIA英伟达中国 2021-08-26 17:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

重新编译并烧写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都存在。

更新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

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发布的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服务:

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环境中并运行。

文章转自:技术社区

作者:NVIDIA英伟达嵌入式系统

编辑:jq

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

    关注

    8

    文章

    689

    浏览量

    31514
  • 容器
    +关注

    关注

    0

    文章

    536

    浏览量

    23028
  • 编译
    +关注

    关注

    0

    文章

    696

    浏览量

    35282

原文标题:技术分享 | 使用Anbox在Jetson Nano 2GB上运行Android应用程序

文章出处:【微信号:ic-china,微信公众号:ICExpo】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    TMS320F28xxx DSP:从内部闪存运行应用程序的全面指南

    TMS320F28xxx DSP:从内部闪存运行应用程序的全面指南 嵌入式系统设计中,让应用程序TMS320F28xxx DSP的内部闪
    的头像 发表于 04-23 13:40 104次阅读

    i.MXRT1173跨界处理器能支持2GB NOR闪存吗?

    does nxp i.MXRT1173 crossover processor can support 2GB NOR flash.If yes what need to be taken
    发表于 04-23 08:25

    S32K系列引导加载程序应用程序跨不同定制电路板设计的跳转问题求解

    的微控制器和核心功能 **问题:** 相同的引导加载程序代码 Board 1 完美运行,但无法跳转到 Board 2
    发表于 04-22 07:02

    如何在NVIDIA Jetson AGX Thor上部署1200亿参数大模型

    一期介绍了如何在 NVIDIA Jetson AGX Thor 使用 Docker 部署 vLLM 推理服务,以及使用 Chatbox 作为前端调用 vLLM 运行的模型(上期文章
    的头像 发表于 12-26 17:06 5271次阅读
    如何在NVIDIA <b class='flag-5'>Jetson</b> AGX Thor上部署1200亿参数大模型

    如何在NVIDIA Jetson平台上运行最新的开源AI模型

    小型、低功耗的边缘设备运行先进的 AI 和计算机视觉工作流正变得越来越具有挑战性。机器人、智能摄像头和自主设备需要实时智能来感知、理解并做出反应,而无需依赖云端。NVIDIA Jetson
    的头像 发表于 12-24 10:38 1898次阅读
    如何在NVIDIA <b class='flag-5'>Jetson</b>平台上<b class='flag-5'>运行</b>最新的开源AI模型

    NVIDIA Jetson系列开发者套件助力打造面向未来的智能机器人

    NVIDIA Jetson AGX Thor、AGX Orin 以及 Jetson Orin Nano Super 开发者套件,助力打造面向未来的智能机器人。
    的头像 发表于 12-13 10:20 3330次阅读

    nordic NRF54蓝牙设备Google Pixel 10“听诊”蓝牙信道示例

    Android操作系统内置的信道探测算法,为两台蓝牙低功耗设备提供精确距离估算。 注意:请确保已按前文所述对反射器RSRP示例应用进行修改后再继续操作。 运行示例的步骤 Pixel 10
    发表于 11-26 17:44

    如何在NVIDIA Jetson AGX Thor通过Docker高效部署vLLM推理服务

    继系统安装与环境配置后,本期我们将继续带大家深入 NVIDIA Jetson AGX Thor 的开发教程之旅,了解如何在 Jetson AGX Thor ,通过 Docker 高效部署 vLLM 推理服务。
    的头像 发表于 11-13 14:08 4417次阅读
    如何在NVIDIA <b class='flag-5'>Jetson</b> AGX Thor<b class='flag-5'>上</b>通过Docker高效部署vLLM推理服务

    BPI-AIM7 RK3588 AI与 Nvidia Jetson Nano 生态系统兼容的低功耗 AI 模块

    (瑞芯微) NVIDIA Jetson Nano 8GB 图灵 RK1 USB 端口 1个USB 3.0,3个USB 2.0 1个USB 3.0,3个USB 2.0 2个USB 3.0
    发表于 10-11 09:08

    BPI-AIM7 RK3588 AI与 Nvidia Jetson Nano 生态系统兼容的低功耗 AI 模块

    应用。 AIM-IO 是一款专为 Jetson Nano 生态系统设计的开源扩展板。它与 RK3588 AI Module7 配合使用,为您提供一个微型 AI 开发平台,支持定制载板开发,并加速机器学习智能
    的头像 发表于 10-11 09:06 1435次阅读
    BPI-AIM7 RK3588 AI与 Nvidia <b class='flag-5'>Jetson</b> <b class='flag-5'>Nano</b> 生态系统兼容的低功耗 AI 模块

    NVIDIA Jetson AGX Thor开发者套件概述

    NVIDIA Jetson AGX Thor 开发者套件为您提供出色的性能和可扩展性。它由 NVIDIA Blackwell GPU和128 GB 显存提供动力支持,提供高达 2070 FP4
    的头像 发表于 08-11 15:03 2082次阅读

    Jetson平台核心组件BOM清单概览

    的接口芯片。对于开发者和系统集成商而言,了解这些关键组件的构成,对于产品选型、硬件设计和成本控制至关重要。 以下我们将根据公开的资料和设计文档,对主流的Jetson平台产品(Jetson Nano
    的头像 发表于 07-30 16:11 3490次阅读

    Arm方案 基于Arm架构的边缘侧设备(树莓派或 NVIDIA Jetson Nano)上部署PyTorch模型

    本文将为你展示如何在树莓派或 NVIDIA Jetson Nano 等基于 Arm 架构的边缘侧设备上部署 PyTorch 模型。
    的头像 发表于 07-28 11:50 3059次阅读

    Made with KiCad(126):Antmicro OV5640 双摄像头子板

    OV5640 图像传感器放置一块 PCB 板 固定孔间距为 20 毫米,可安装标准 S 型镜头支架 每个传感器均可通过独立的双通道 MIPI CSI-2 接口访问 用于传感器配置的独立 I
    发表于 05-12 18:13

    同样的代码官方开发板运行正常,自己板子就跑不起来,怎么办?

    同样的代码Nordic官方开发板可以运行正常,但在自己板子就跑不起来,如果你碰到了上述情况,建议按照如下步骤进行自检: 首先确认用户板元器件焊接良好,功能正常。如果你的板子有LE
    的头像 发表于 05-12 15:26 910次阅读
    同样的代码<b class='flag-5'>在</b>官方开发板<b class='flag-5'>上</b><b class='flag-5'>运行</b>正常,<b class='flag-5'>在</b>自己板子<b class='flag-5'>上</b>就跑不起来,怎么办?