随着云计算相关产业蓬勃发展,用户对移动设备的弹性需求推动出云手机、云游戏等概念,云手机和云游戏就是将云计算技术运用于网络终端服务,通过云服务器实现云服务的手机,支持弹性适配用户个性化需求,释放手机本身硬件资源。
安卓系统在arm平台上有着广泛部署的历史,arm同时提供了高性能的云计算平台,既完全兼容安卓生态,无指令翻译环节,海量应用无需迁移,又支持虚拟化和容器技术,cpu、内存、存储和网络等资源可按需弹性分配,可以完美地为终端用户提供安卓云服务。终端用户可以通过手机、电脑等设备远程访问arm服务器上的安卓实例,并运行标准的安卓应用程序和游戏。
本文主要介绍在arm服务器上,robox安卓容器方案的构建编译过程和使用方法。
robox简介
robox容器方案是基于docker容器使能安卓系统的虚拟化方案。容器的实现是基于一个anbox的基本框架,基本架构如下图所示。
环境要求
服务器:arm服务器1台
显卡:amd radeon pro wx 7100 或 nvidia tesla t4
配置编译环境 系统要求
os: ubuntu 20.04.2
kernel: 5.4.0
安装依赖库和基础组件 1. 基础依赖库
apt install dpkg libncurses5-dev libncursesw5-dev libssl-dev 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 libdbus-1-dev libegl1-mesa-dev libgles2-mesa-dev libglib2.0-dev libglm-dev libgtest-dev liblxc1 libproperties-cpp-dev libprotobuf-dev libsdl2-dev libsdl2-image-dev lxc-dev pkg-config protobuf-compiler libboost-filesystem1.62.0 libboost-system1.62.0 docker.io dkms libboost-iostreams1.62.0 apt install build-essential apt install mesa-common-dev
2. 下载依赖库并安装 下载: libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb: https://launchpad.net/ubuntu/zesty/arm64/libprocess-cpp3/3.0.1-0ubuntu5 libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb: https://launchpad.net/ubuntu/zesty/arm64/libdbus-cpp5/5.0.0+16.10.20160809-0ubuntu2 libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb: https://launchpad.net/ubuntu/bionic/arm64/libdbus-cpp-dev/5.0.0+16.10.20160809-0ubuntu2
安装
dpkg -i libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb dpkg -i libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb dpkg -i libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb 3. 更换docker storage driver 登录到服务器,查看docker信息 修改storage driver的版本 如果“storage driver”的版本为“overlay”或者“overlay2”,则不需要进行调整;如果“storage driver”的版本为“aufs”,则需要把“storage driver”从“aufs”修改为“overlay”,步骤如下: 打开“/etc/default/docker”文件 vim /etc/default/docker 添加如下脚本 docker_opts= -s overlay 重启docker让修改生效 /etc/init.d/docker restart 查看docker的storage driver版本 安装远程桌面 安装xfce4
apt install xfce4 xfce4-* xrdp 打开.xsession文件夹
cd /home/ubuntuvi .xsession 注意 “/home/ubuntu”为用户文件夹。
在.xsession中添加如下内容
xfce4-session 重启xrdp远程桌面
/etc/init.d/xrdp restart 此后,可以通过远程桌面访问服务器图形桌面,使用root帐号登录。 robox 安装和配置
1. 下载robox源码并解压到/home/目录下
https://github.com/kunpengcompute/robox/tree/master2. binder.ko和ashmem.ko模块编译安装 下载内核源码,供内核模块编译
apt search linux-sourceapt install linux-source-5.4.0 拷贝ashmem和binder源码
cd /home/robox-master/kernel/robox-modulescp anbox.conf /etc/modules-load.d/cp 99-anbox.rules /lib/udev/rules.d/cp -rt ashmem /usr/src/anbox-ashmem-1cp -rt binder /usr/src/anbox-binder-1 使用dkms进行编译和安装
dkms install anbox-ashmem/1dkms install anbox-binder/1 将ko模块安装到内核,binder_linux模块需要带参数
modprobe ashmem_linuxmodprobe binder_linux num_devices=254lsmod | grep -e ashmem_linux -e binder_linuxchmod 777 /dev/ashmem /dev/binder* 注意:每次服务器重启后,需要将binder_linux模块移除之后,再重新安装。
若ashmem和binder的属性权限不是下列命令显示的,需要使用chmod添加权限
ls -alh /dev/binder* /dev/ashmemcrwxrwxrwx 1 root root 10, 55 oct 22 10:47 /dev/ashmemcrwxrwxrwx 1 root root 511, 0 oct 22 10:47 /dev/binder0crwxrwxrwx 1 root root 511, 0 oct 22 10:47 /dev/binder1... 3. 注册安卓镜像并存储在docker中 下载安卓镜像包:android.imghttps://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/native/android.img
将android镜像挂载到“/mnt”目录
cd /homemount /home/android.img /mnt 进入/mnt目录,注册镜像
cd /mnttar --numeric-owner -cf- . | docker import - android:robox_with_exagear 查看系统容器
回显信息如下,则确认android容器存在
4. 编译robox源码 创建编译目录
cd /home/robox-mastermkdir buildcd build 配置编译,在“/home/robox-master/build”目录执行命令
cmake .. 在“/usr/include/glm/gtx/transform.hpp”文件中在第21行添加以下内容
编译安装
make -jmake install 5. 使能显卡 amd显卡
安装xfce4桌面和相关工具
apt install -y xfce4 mesa-utils x11vnc vainf 修改/etc/x11/xorg.conf配置文件
在xorg.conf文件中添加如下内容,其中busid项需要根据服务器中显卡pci号修改(busid都是用英文冒号(:)分隔)
ection serverflags option dontvtswitch on option autoadddevices off option autoenabledevices off option autoaddgpu off option autobindgpu off endsection section device identifier amd driver amdgpu busid pci00:00 endsection section monitor identifier monitor0 modeline 1280x720 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync option enable true endsection section screen identifier screen0 device amd monitor monitor0 defaultdepth 24 subsection display depth 24 modes 1280x720 endsubsection endsection 查询显卡的pci号
#lspci |grep amd05:00.0 vga compatible controller: advanced micro devices, inc. [amd/ati] ellesmere [radeon pro wx 7100]05:00.1 audio device: advanced micro devices, inc. [amd/ati] ellesmere hdmi audio [radeon rx 470/480 / 570/580/590] 注意:
lspci看到的busid是十六进制的,而配置文件中的busid里面的值是十进制的,所以需要做下转换,例如上面查询到的结果是81:00.0,而配置文件里面应该填入的是pci00:00。 配置文件中的busid格式是pcixx:xx,都是用“:”分隔的,而lspci看到的busid的信息是xx:xx.x,请勿直接拷贝lspci查到的busid去覆盖配置文件中的busid。 modeline 1280x720 字段需要大于等于安卓系统的分辨率。
编译安装mesa-19.0.8版本。重装mesa方法如下
下载mesa代码, 进入mesa代码目录,切换到19.0.8分支。 cd /home/ git clone https://anongit.freedesktop.org/git/mesa/mesa.git cd /home/mesa git checkout mesa-19.0.8下载编译依赖包 apt build-dep mesa apt install libomxil-bellagio-dev libva-dev llvm-7 llvm-7-dev python-mako执行autogen.sh生成makefile ./autogen.sh --enable-texture-float --with-gallium-drivers=radeonsi,swrast --with-dri-drivers=radeon,swrast --with-platforms=drm,x11 --enable-glx-tls --enable-shared-glapi --enable-dri3 --enable-lmsensors --enable-gbm --enable-xa --enable-osmesa --enable-vdpau --enable-nine --enable-omx-bellagio --enable-va --with-llvm-prefix=/usr/lib/llvm-7 --enable-llvm --target=aarch64-linux-gnu cflags=-fsigned-char -o2 cppflags=-fsigned-char -o2 cxxflags=-fsigned-char -o2 --enable-autotools 编译并安装 make -j make install 修改ldconfig更改库链接顺序,打开/etc/ld.so.conf文件, 添加/usr/local/lib到文件首内容,修改后内容如下 cat /etc/ld.so.conf /usr/local/lib include /etc/ld.so.conf.d/*.conf 执行如下命令使能 ldconfig 测试xorg是否可以正常启动 xorg :0 -config /etc/x11/xorg.conf nvidia显卡
安装显卡驱动
wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux_sbsa.runsudo sh cuda_11.6.2_510.47.03_linux_sbsa.run 运行如下命令创建xconfig文件
sudo nvidia-xconfigxorg :0 -config /etc/x11/xorg.conf 启动robox安卓实例
将robox-master源码里中binaryfiles目录下的启动脚本robox拷贝到/home/robox-master下 cp /home/robox-master/binaryfiles/ /home/robox-master注意:robox脚本里的docker run命令中的镜像名称需要改成本地自己注册的名称 设置环境变量,将容器指定到gpu卡上运行 export display=:0注意: robox脚本中设置的display号要与此处设置的display号一致。 启动robox之前,先查看环境变量xdg_runtime_dir是否存在,若不存在,可以在robox可执行脚本开始位置中增加export xdg_runtime_dir=/run/user/0,同时要确保“/run/user/0”目录存在。 启动robox容器时,必须按照顺序来启动,即要先启动instance1,然后才能启动instance2、instance3、……,不能跳着启动,否则不能使用宿主机ip地址连接robox容器。
启动robox容器实例,后面的数字代表启动的实例编号,可以同时启动多个实例 ./robox -v start 1 查看docker实例进程 #docker ps container id image command created status ports names b77d371b402c android:robox_with_exagear /anbox-init.sh 13 seconds ago up 11 seconds 0.0.0.0:5561->5555/tcp instance2 77b2c041315f android:robox_with_exagear /anbox-init.sh 2 hours ago up 2 hours 0.0.0.0:5559->5555/tcp instance1 查看主机session进程,查看instance1、instance2对应的两个session是否正常运行 #ps -aux | grep session root 4330 0.0 0.0 9332 6160 ? ss oct22 0:01 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile -- systemd-activation --syslog-only root 172678 22.1 0.0 6433328 250472 pts/8 sl 19:51 25:38 anbox session-manager --run-multiple=instance1 --standalone -- experimental --single-window --gles-driver=translator --window-size=720,1280 root 215155 1.4 0.0 5196228 185688 pts/8 sl 21:46 0:01 anbox session-manager --run-multiple=instance2 --standalone -- experimental --single-window --gles-driver=translator --window-size=720,1280 登录到安卓容器内,确认robox实例是否启动成功 #docker exec -it instance1 sh 77b2c041315f:/ # getprop | grep sys.boot.completed [sys.boot_completed]: [1]sys.boot.completed显示为1,标识安卓启动完毕
远程访问安卓实例
使用scrcpy远程访问安卓实例。scrcpy是一款开源免费的安卓投屏控制软件,支持在pc、mac、linux上运行。可参考下面链接安装: https://github.com/genymobile/scrcpy/blob/master/readme.zh-hans.md使用方法: adb连接到安卓实例
adb connect serverip:android_instance_port 使用scrcpy远程访问安卓实例
scrcpy -s serverip:android_instance_port 总结
基于以上步骤可以在arm服务器上快速构建安卓云服务,终端用户可以在手机、电脑等设备上远程访问服务器上的安卓实例,并按需求安装、运行标准的安卓应用程序和游戏,运行效果如下图。
原文标题:技术分享 | 基于arm服务器的安卓云容器方案构建方法
文章出处:【微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。
中国联通(香港)8月打出iphone7广告,疑似默认9月将发布
人机交互的方式有哪些?
7100A-0100加速度传感器的安装方式
韩国成功开发出一种能够替代氮化镓生产蓝光LED的新型LED材料 生产成本将更低
Alder Lake至少要到明年下半年才会发布?
Robox安卓容器的构建编译过程和使用方法
嵌入式电子潮流前瞻:家居智能系统与可视对讲
怎样才能快速高效地给我们的防静电区域进行接地呢?
英国北约克郡全面使用LED路灯替代传统路灯,碳排放和成本大幅降低
下一代激光雷达要来了?近期多家厂商推出FMCW技术方案
12.5GHz 4×4微带天线阵列的设计详细教程
EMI辐射设计理论和思路
单功能电气测试仪的特点介绍
神州云动CRM签约全球化企业通信专业服务商百悟科技
!销售/收购/维修HP437B HP437B功率计HP437
智慧公安情报研判系统开发指挥调度系统搭建
安防行业强势发展,芯片国产化速度加快
什么是过流保护?过流保护的工作原理和分类
GVS为市场打造可进化的智能家居体验
我司HS-DSC-101差示扫描量热仪两次出现在SCI论文