大家好,我是极客范的本期栏目编辑小友,现在为大家讲解如何使用Anbox在Jetson Nano 2GB上运行Android应用程序问题。
* *捷信Nano 2GB是英伟达性价比较高的嵌入式平台。麻雀虽然体积小,装备精良,但战斗力强,可惜没有原生安卓系统支持。目前想在捷信平台体验安卓,可以用虚拟机运行安卓系统,也可以用安博克斯这样的平台。
Anbox是基于容器开发的,可以为安卓程序提供原生运行支持。今天,让我们尝试在捷森纳米上编译和部署Anbox。基本步骤请参考NVIDIA论坛的文章【安博克斯对捷森纳米的看法】,根据需要做一些调整。
重新编译并刻录Jetson Nano 2GB内核。
本节涉及L4T内核定制。
安博克斯依靠两个车手,班德和阿什姆。捷信Nano 2GB的最新内核版本是4.9.201。这两个驱动程序已经在捷信Nano的内核中,但是默认情况下并没有打开。首先,我想尝试将这两个驱动程序直接编译成模块来加载,而不需要重新编译内核。活页夹可以正常加载,但ashmem无法成功加载。原因是4.9中不允许将这两个驱动独立编译成可加载模块。也就是说,它必须与内核源代码作为一个整体进行编译。为了安全起见,我选择整体重新编译内核,开启驱动支持,这和论坛里的操作是一致的。
1.1环境准备
已刻录映像并完成启动初始化的捷信纳米2GB设备,请参阅捷信纳米2GB开发套件入门。
Jetson开发推荐使用Ubuntu18.04,交叉编译推荐使用Linaro GCC 7,内核源代码可以使用Jetpack提供的脚本通过git获取,也可以手动下载。我们在这里使用手动下载[L4T驱动程序包(BSP)来源]。
解压缩交叉编译工具链
mkdir $HOME/l4t-gcc
cd $HOME/l4t-gcc
tar Jxvf/PATH _ TO _ DOWNLOADS/gcc-linaro-7 . 3 . 1-2018.05-x86 _ 64 _ aarch 64-Linux-GNU . tar . xz
解压缩L4T BSP源包和内核
mkdir $ HOME/l4t-来源
CD $ HOME/l4t-来源
tar jxvf/PATH _ TO _ DOWNLOADS/public _ sources . tbz 2
CD Linux _ for _ Tegra/来源/公共
tar jxvf内核_src.tbz2
1.2编译并烧录内核
在$ home/l4t-source/Linux _ for _ tegra/source/public/kernel/kernel-4.9/arch/arm 64/configs/tegra _ defconfig文件的末尾,添加:
Anbox配置
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG _ ANDROID _ BINDER _ IPC _ self test=y
CONFIG _ ASHMEM=y
编译内核:
配置环境变量
导出CROSS_COMPILE=
indent:2em;"> $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
**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
.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content: "广告"; } .dfma img { display: block; }